2012-05-30 2 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> 

Есть ли способ указать порядок обработки, или мне нужно использовать отдельные правила «apply-template» для каждого узла в ключе?

ответ

1

Вы можете изменить свой код

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

Как вы используете XSLT 2.0 Я также задаюсь вопросом, почему вы используете ключи для группировки, но это другой вопрос.

Смежные вопросы