2016-01-07 1 views
1

У меня есть XML, как это,XSLT - Группировка динамических узлов в пределах применить-шаблон

<doc> 
    <aa type="xx">aaaa</aa> 
    <aa type="xx">bbbb</aa> 
    <aa type="yy">ccccc</aa> 
    <aa type="zz">dddd</aa> 
    <aa type="yy">eeee</aa> 
    <aa type="xx">ffff</aa> 
    <aa type="yy">gggg</aa> 
</doc> 

в моем сценарии атрибут типа переменный, мне нужно сгруппировать выше XML в упорядоченно, проверяя атрибут типа, значение атра типа появляется в верхней части должен иметь приоритет, поэтому выход должен быть

<doc> 
    <aa type="xx">aaaa</aa> 
    <aa type="xx">bbbb</aa> 
    <aa type="xx">ffff</aa> 
    <aa type="yy">ccccc</aa> 
    <aa type="yy">eeee</aa> 
    <aa type="yy">gggg</aa> 
    <aa type="zz">dddd</aa>  
</doc> 

, так как значение атрибута типа является переменным (я не знаю точное значение типа), я написал шаблон, как следует,

<xsl:template match="doc"> 
    <doc> 
     <xsl:apply-templates select="aa[@type='{@type}']"/> 
    </doc> 
</xsl:template> 

с помощью group-by было бы легче implememt способ сделать задачу, но я могу сделать это только с помощью apply-template

ответ

1

Я понимаю, что вы хотите применить шаблоны на всех узлах <aa> упорядоченно. Вы можете сделать это с помощью для-каждый, что позволяет сортировать:

<xsl:template match="doc"> 
    <doc> 
     <xsl:for-each select="aa"> 
      <xsl:sort select="@type"/> 
      <xsl:apply-templates select="."/> 
     </xsl:for-each> 
    </doc> 
</xsl:template> 
+3

'XSL: sort' работает на' XSL: применить-templates', так что вы можете упростить его ' ' –

+0

Довольно круто, не знал, что – fafl

+0

@TimC работает отлично. Действительно полезно. – sanjay