无法使用xslt循环xml

时间:2017-06-22 06:58:13

标签: 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: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>

我正在尝试循环播放&#34;记录&#34;如下所示使用xslt for-each进行标记,但它返回空结果。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:partner.soap.sforce.com" xmlns:sf="urn:sobject.partner.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
   <xsl:output encoding="iso-8859-1" method="text" />
   <xsl:template match="/">
      <xsl:variable name="newline">
         <xsl:text />
      </xsl:variable>
      <xsl:text>Type||Id</xsl:text>
      <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:template>
</xsl:stylesheet>

预期输出

Type||Id  
Type1||123  
Type2||456  

1 个答案:

答案 0 :(得分:0)

您的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指令不产生任何输出。