XSLT:按另一个元素的值选择元素

时间:2017-06-29 10:40:54

标签: xml xslt

如何输出一个依赖于其他元素值的元素的值? 我想用另一个元素的值代替XXX

<xsl:value-of select="/node1/node2[@name=XXX]"/@lng>

并且在XXX我想要的价值:

/node3/node4/@val

简化的xml:

<node>
    <node1>
        <node2 name="abc" lng="uk">
        </node2>
    </node1>
    <node3>
        <node4 val="abc">
        </node4>
    </node3>
</node>

我知道可以通过以下方式实现:

<xsl:value-of select="/node1/node2[@name='abc']"/@lng>

但我不知道node4 / @ val中的值是多少 我怎样才能实现它?

1 个答案:

答案 0 :(得分:1)

你的问题的一个答案就是这样做......

<xsl:value-of select="/node/node1/node2[@name=/node/node3/node4/@val]/@lng" />

或稍好一点,使用变量

<xsl:variable name="node4val" select="/node/node3/node4/@val" />
<xsl:value-of select="/node/node1/node2[@name=$node4val]/@lng" />

但我猜你的XML中可能有多个node4元素,也许你想获得每个元素的值?在这种情况下,它看起来更像是......

<xsl:for-each select="/node/node3/node4">
   <xsl:value-of select="/node/node1/node2[@name=current()/@val]/@lng" />
</xsl:for-each>

或者,使用变量

<xsl:for-each select="/node/node3/node4">
   <xsl:variable name="val" select="@val" />
   <xsl:value-of select="/node/node1/node2[@name=$val]/@lng" />
</xsl:for-each>

更好的是使用密钥。试试这个,例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="node2s" match="node2" use="@name" />

  <xsl:template match="/">
    <xsl:for-each select="/node/node3/node4">
      <xsl:value-of select="key('node2s', @val)/@lng" />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>