元ネタ: ``Sorting XSLT output items'' -- comp.text.xml
index.xml
<root>
<link href="data1.xml" />
<link href="data2.xml" />
</root>
data1.xml
<root>
<data index="6">VI</data>
<data index="2">II</data>
</root>
data2.xml
<root>
<data index="1">I</data>
<data index="4">IV</data>
<data index="2">II</data>
<data index="10">X</data>
</root>
上記のindex.xmlに対して下記のXSLTを適応すると、 data1.xml/data2.xml の 全ての /root/data/@index に対してソートが適応されます。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl"
>
<xsl:output method="xml" />
<xsl:template match="/" >
<root>
<xsl:for-each select="document(root/link/@href)/root/data">
<xsl:sort select="./@index" data-type="number"/>
<data><xsl:value-of select="." /></data>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
結果
<root>
<data>I</data>
<data>II</data>
<data>II</data>
<data>IV</data>
<data>VI</data>
<data>X</data>
</root>
XSLT2.0勧告の§16.1 をみたら、document() はuriのsequenceを引数に取るって書いてある。いやー、知らんかった.




コメントする