无法使用xslt对xml进行循环
我无法在xslt中使用for each循环遍历下面的xml无法使用xslt对xml进行循环,xml,xslt,Xml,Xslt,我无法在xslt中使用for each循环遍历下面的xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:sf="urn:sobject.partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:sf="urn:sobject.partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<queryResponse>
<result xsi:type="QueryResult">
<records xsi:type="sf:sObject">
<sf:type>Type1</sf:type>
<sf:Id>123</sf:Id>
</records>
<records xsi:type="sf:sObject">
<sf:type>Type2</sf:type>
<sf:Id>456</sf:Id>
</records>
</result>
</queryResponse>
</soapenv:Body>
</soapenv:Envelope>
您的XML包含一个默认名称空间声明
xmlns=“urn:partner.soap.sforce.com”
,您没有正确处理该声明。您不能像以前那样将其复制到样式表中
相反,将其更改为xpath default namespace=“urn:partner.soap.sforce.com”
(假设您确实在使用样式表版本所指示的XSLT 2.0处理器)
一旦您这样做,您的:
<xsl:for-each select="/soapenv:Envelope/soapenv:Body/queryResponse/result/records">
<xsl:value-of select="//sf:type" />||<xsl:value-of select="//sf:Id" />
<xsl:value-of select="$newline" />
</xsl:for-each>
||
将起作用(某种程度上,见下文)
如果要限制结果的类型,请使用:
<xsl:for-each select="/soapenv:Envelope/soapenv:Body/queryResponse/result[@xsi:type='QueryResult']/records">
请注意:
<xsl:variable name="newline">
<xsl:text />
</xsl:variable>
毫无意义。空的
xsl:text
指令不会产生任何输出。请尝试/soapenv:Envelope/soapenv:Body/queryResponse/result[@xsi:type=“QueryResult]/records
您需要注意xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/
是命名空间声明,而不是属性。-此外,您不能嵌套双引号:例如,对QueryResult
使用单引号。格式不正确:元素类型“xsl:for each”后面必须跟属性规范“>”或“/>”@YadhuandhanC发布完整的样式表,以便我们可以看到(如果有的话)您是如何处理名称空间的。还要发布预期结果。@michael.hor257k-是的,我已经在xslt xsl:stylesheet顶部声明了名称空间。即使我删除它,结果是sameHi@michael.hor257k,我还是在xsl:stylesheet元素中将其更改为xpath default namespace=“urn:partner.soap.sforce.com”,错误消息是“无效。错误:javax.xml.transform.TransformerException:“xsl:stylesheet元素上不允许使用xpath default namespace”属性!”。我删除了它,没有更多的错误,但是输出是空的,只有'Type | | Id'@YadhuandhanC我说这假设您使用的是XSLT2.0处理器。是吗?非常感谢@micheal.hor257k,问题出在xslt处理器上,通过服务器重启修复:-)现在xslt通过添加xpath默认名称空间按预期工作
<xsl:for-each select="/soapenv:Envelope/soapenv:Body/queryResponse/result[@xsi:type='QueryResult']/records">
<xsl:variable name="newline">
<xsl:text />
</xsl:variable>