在 XSLT 中,嵌套的 foreach 循环总是 return 第一个元素

In XSLT nested foreach loop always return first element

XLST 在下面的格式中从 apache-camel 接收日期。

数据格式

<list>
  <linked-hash-map>
    <entry key="NAME">test1</entry>
  </linked-hash-map>
  <linked-hash-map>
    <entry key="NAME">test2</entry>
  </linked-hash-map>
</list>

我的 XSLT:

<xsl:stylesheet>
  <xsl:template match="*">
      <xsl:for-each select="//*[local-name()='linked-hash-map']">
       <tag1>
            <xsl:value-of select="string(//*[local-name()='entry'][@key='NAME'])"/>
       </tag1t>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

OUTPUT 总是 returns 第一个元素。

<tag1>test1<tag1>
<tag1>test1<tag1>

上面的 xslt 有什么问题,请帮助生成包含所有元素的 xml。

因为路径表达式以“//”开头 select 从文档树的根开始,您每次在 xsl:value-of 中都 select 使用相同的节点;在 XSLT 1.0 中,如果您 select 多个节点,则只显示第一个节点。

我认为您正在使用“//”,因为您已经在示例代码中看到它但实际上并不理解它的含义...

xsl:for-each 内,您通常需要 select 来自 for-each 当前正在处理的节点的相对路径。

您也可能从其他人的代码中习得了这个 *[local-name()='linked-hash-map'] 习惯。由于不涉及名称空间,您可以安全地将其替换为 linked-hash-map.