Xml XSLT:如何按照指定的顺序从键返回结果

Xml XSLT:如何按照指定的顺序从键返回结果,xml,xslt,xpath,Xml,Xslt,Xpath,我试图根据元素“title”元素中的数字选择元素,然后按特定顺序返回它们。我已经使用一个键对它们进行了分组,但是当我访问它们的键并将模板应用到节点时,它们并没有按照指定的顺序返回 示例代码: <test> <anElement> <title>001 title</title> </anElement> <anElement> <title>002 titl

我试图根据元素“title”元素中的数字选择元素,然后按特定顺序返回它们。我已经使用一个键对它们进行了分组,但是当我访问它们的键并将模板应用到节点时,它们并没有按照指定的顺序返回

示例代码:

<test>
    <anElement>
        <title>001 title</title>
    </anElement>
    <anElement>
        <title>002 title</title>
    </anElement>
    <anElement>
        <title>003 title</title>
    </anElement>
    <anElement>
        <title>004 title</title>
    </anElement>
    <anElement>
        <title>005 title</title>
    </anElement>
    <anElement>
        <title>006 title</title>
    </anElement>
    <anElement>
        <title>007 title</title>
    </anElement>
    <anElement>
        <title>008 title</title>
    </anElement>
    <anElement>
        <title>009 title</title>
    </anElement>
    <anElement>
        <title>010 title</title>
    </anElement>   
</test>

001标题
002标题
003标题
004标题
005标题
006标题
007标题
008标题
009标题
010标题
当转换为:

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

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="keyNodes" match="//anElement" use="title/substring(., 1, 3)"/>

<xsl:template match="/">
    <groupsOfNodes>
       <aGroup>
           <title>group one</title>
        <members>
            <xsl:apply-templates select="key('keyNodes', ('003', '002', '001'))"/>
         </members>
       </aGroup>
        <aGroup>
            <title>group one</title>
            <members>
                <xsl:apply-templates select="key('keyNodes', ('010', '009', '008'))"/>
            </members>
        </aGroup>
    </groupsOfNodes>
</xsl:template>

<xsl:template match="anElement">
    <para><xsl:apply-templates/></para>
</xsl:template>

</xsl:stylesheet>

第一组
第一组
给出以下结果:

<groupsOfNodes>
   <aGroup>
  <title>group one</title>
  <members>
     <para>001 title</para>
     <para>002 title</para>
     <para>003 title</para>
  </members>
  </aGroup>
   <aGroup>
  <title>group one</title>
  <members>
     <para>008 title</para>
     <para>009 title</para>
     <para>010 title</para>
  </members>
   </aGroup>
  </groupsOfNodes>

第一组
001标题
002标题
003标题
第一组
008标题
009标题
010标题
以下是所需结果的示例:

    <members>
     <para>003 title</para>
     <para>002 title</para>
     <para>001 title</para>
  </members>

003标题
002标题
001标题

有没有办法指定它们的处理顺序,或者我必须对键中的每个节点使用单独的“应用模板”规则?

您可以将代码更改为

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

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="keyNodes" match="anElement" use="title/substring(., 1, 3)"/>

<xsl:template match="/">
    <groupsOfNodes>
       <aGroup>
           <title>group one</title>
        <members>
            <xsl:apply-templates select="for $s in ('003', '002', '001') return key('keyNodes', $s)"/>
         </members>
       </aGroup>
        <aGroup>
            <title>group one</title>
            <members>
                <xsl:apply-templates select="for $s in ('010', '009', '008') return key('keyNodes', $s)"/>
            </members>
        </aGroup>
    </groupsOfNodes>
</xsl:template>

<xsl:template match="anElement">
    <para><xsl:apply-templates/></para>
</xsl:template>

</xsl:stylesheet>

第一组
第一组
在使用XSLT2.0时,我还想知道为什么要使用键进行分组,但这是另一个问题