2012-05-30 29 views
0

我試圖根據其「title」元素中的數字選擇元素,然後按特定順序返回它們。我使用一個鍵對它們進行分組,但是當我訪問它們時,它們鍵入並將模板應用於節點,它們不會按指定的順序返回。XSLT:如何從一個關鍵字返回結果,按指定順序

示例代碼:

<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> 

當與轉化:

<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> 

下面是所期望的結果的一個例子:

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

有什麼方法可以指定它們的處理順序,還是我必須爲密鑰中的每個節點使用單獨的「應用模板」規則?

回答

1

你可以如你,爲什麼你使用的密鑰進行分組,但是這是一個不同的問題,使用XSLT 2.0我也想知道你的代碼更改

<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> 

相關問題