はい、次の形式のものを使用してください:
<xsl:apply-templates select="example">
<xsl:sort select="*[name()=sortby]" data-type="{sort-data-type}"
order="{sort-order}" />
</xsl:apply-templates>
並べ替えのデータ型と順序も指定する必要があることに注意してください。
完全な例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="example">
<xsl:sort select="*[name()=/*/sortby]" data-type="{/*/sort-data-type}"
order="{/*/sort-order}" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="example">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
この変換が次のXMLドキュメントに適用される場合:
<examples>
<sortby>year</sortby>
<sort-data-type>number</sort-data-type>
<sort-order>descending</sort-order>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
必要な正しい結果が生成されます:
<examples>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
<example>
<year>2008</year>
<number>3</number>
</example>
</examples>
同じ変換がこのXMLドキュメントに適用される場合(上記と同じですが、変更されたsortby
とsort-order
):
<examples>
<sortby>number</sortby>
<sort-data-type>number</sort-data-type>
<sort-order>ascending</sort-order>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
次に、再び必要な正しい結果が生成されます:
<examples>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
説明:
のselect
属性にxsl:sort
は任意のXPath式を含めることができるため、ソートする要素の子を選択する式を指定して、その名前が別のXPath式を評価した結果になるようにすることができます。
select
XSLTでは、通常、 * AVT *(属性値テンプレート)以外のすべての属性を値に指定できます。