我无法使用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/records">
<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
答案 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/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
指令不产生任何输出。