如何使用一个XML节点顺序对另一个进行排序?

时间:2013-11-19 02:38:22

标签: xml xslt-1.0 xslt-2.0

鉴于两个不同的节点,如何使用id上第一个(水果)匹配的顺序对第二个(产品)进行排序?

<root>
    <fruit>
        <type id="3">Apple</type>
        <type id="32">Tomato</type>
        <type id="45">Pear</type>
        <type id="119">Pineapple</type>
    </fruit>

    <produce>
        <type id="45" location="aisle-five">Pear</type>
        <type id="3" location="aisle-one">Apple</type>
        <type id="119" location="aisle-seven">Pineapple</type>
        <type id="32" location="aisle-three">Tomato</type>
    </produce>
</root>

XSLT会像这样......

<xsl:template match="/">
    <xsl:apply-templates select="root"> 
        <xsl:sort select="???" order="ascending" data-type="number" />
    </xsl:apply-templates>  
</xsl:template>

<xsl:template match="root/produce">
    <xsl:value-of select="type/@location" />
</xsl:template> 

期望的输出:

aisle-one
aisle-five
aisle-three
aisle-seven

这是我无法控制XML的情况,只有第二个节点对我有用。正如您可能猜测的那样,实际数据更加复杂,但概念是相同的。

1 个答案:

答案 0 :(得分:0)

定义一个键

<xsl:key name="sort-key" match="/root/fruit[1]/type" use="."/>

然后您的排序可以

<xsl:apply-templates match="produce">
  <xsl:sort select="key('sort-key', .)/@id" data-type="number"/>
</xsl:apply-templates>

我假设您要对produce元素中的类型元素进行排序,尽管您的代码似乎试图对根元素进行排序。