Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用xslt对xml进行循环_Xml_Xslt - Fatal编程技术网

无法使用xslt对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">

我无法在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: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/reco‌​rds">
     <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>