谓词中循环中当前元素的访问属性

时间:2011-10-25 14:38:53

标签: xml xslt xpath

我有一个for-each我希望按某种值排序。但我循环的东西只有一个允许连接到值的键。文档的一个简单示例:

<foo>
  <keys>
    <key id="foo"/>
    <key id="bar"/>
  </keys>

  <things>
    <thing name="foo"><desc>some description</desc></thing>
    <thing name="bar"><desc>another description</desc></thing>
  </things>
</foo>

样式表:

<xsl:for-each select="/foo/keys/key">
  <xsl:sort select="/foo/things/thing[@name=@id]"/>
  <xsl:value-of select="@id"/>
</xsl:for-each>

这似乎不起作用。 @id与循环中的key元素相关; @name与谓词中的thing相关。我该如何解决这个问题?我尝试将/foo/keys/key/@id分配给变量并使用它,但<sort>必须是for-each中的第一个元素......

1 个答案:

答案 0 :(得分:1)

使用current()功能:

<xsl:sort select="/foo/things/thing[@name = current()/@id]"/>

参考:http://www.w3.org/TR/xslt#misc-func

XML:

<foo>
    <keys>
        <key id="1"/>
        <key id="2"/>
        <key id="3"/>
        <key id="4"/>
    </keys>

    <things>
        <thing name="2">
            <desc>a</desc>
        </thing>
        <thing name="4">
            <desc>b</desc>
        </thing>
        <thing name="3">
            <desc>c</desc>
        </thing>
        <thing name="1">
            <desc>d</desc>
        </thing>
    </things>
</foo>

XSLT:

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


    <xsl:template match="/">
        <xsl:for-each select="/foo/keys/key">
            <xsl:sort select="/foo/things/thing[@name = current()/@id]"/>
            <xsl:value-of select="@id"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

输出:

2431