わかりましたので、この質問XSLT 1.0 sort elementsに基づいて、以下が機能しない理由を理解できません:
次の XML があります。
<?xml version="1.0" encoding="UTF-8"?>
<viewentries>
<viewentry>
<entrydata name="Waste">
<text>Bric-a-Brac</text>
</entrydata>
<entrydata name="Disposal">
<text/>
</entrydata>
</viewentry>
<viewentry>
<entrydata name="Waste">
<textlist>
<text>Paper</text>
<text>Glass</text>
</textlist>
</entrydata>
<entrydata name="Disposal">
<text/>
</entrydata>
</viewentry>
<viewentry>
<entrydata name="Waste">
<textlist>
<text>Paper</text>
<text>Cans</text>
</textlist>
</entrydata>
<entrydata name="Disposal">
<text>Washing Machines</text>
<text>Cars</text>
</entrydata>
</viewentry>
</viewentries>
そして、次の XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="k1" match="entrydata[@name = 'Waste' or @name = 'Disposal']//text" use="concat(ancestor::entrydata/@name, '|', .)"/>
<xsl:template match="viewentries">
<categories>
<xsl:apply-templates/>
</categories>
</xsl:template>
<xsl:template match="viewentry">
<xsl:apply-templates select="entrydata[@name = 'Waste' or @name = 'Disposal']//text
[generate-id() = generate-id(key('k1', concat(ancestor::entrydata/@name, '|', .))[1])]">
<xsl:sort select="."/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="text[normalize-space() != '']">
<category type="{ancestor::entrydata/@name}">
<xsl:apply-templates/>
</category>
</xsl:template>
</xsl:stylesheet>
これにより、次の出力が得られます。
<?xml version="1.0" encoding="UTF-8"?>
<categories>
<category type="Waste">Bric-a-Brac</category>
<category type="Waste">Glass</category>
<category type="Waste">Paper</category>
<category type="Waste">Cans</category>
<category type="Disposal">Cars</category>
<category type="Disposal">Washing Machines</category>
</categories>
ソートされた順序で出力が必要です:
<?xml version="1.0" encoding="UTF-8"?>
<categories>
<category type="Waste">Bric-a-Brac</category>
<category type="Waste">Cans</category>
<category type="Disposal">Cars</category>
<category type="Waste">Glass</category>
<category type="Waste">Paper</category>
<category type="Disposal">Washing Machines</category>
</categories>
私は何を間違っていますか?
編集:
すべての値ではなく、最初の<text>
値のみに基づいてソートしているようです。<entrydata>
<text>
ただし、このスタイルシートは正常に機能します。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="k1" match="entrydata[@name = 'Waste' or @name = 'Disposal']//text" use="concat(ancestor::entrydata/@name, '|', .)"/>
<xsl:template match="viewentries">
<categories>
<xsl:apply-templates select="viewentry/entrydata[@name = 'Waste' or @name = 'Disposal']//text
[generate-id() = generate-id(key('k1', concat(ancestor::entrydata/@name, '|', .))[1])]">
<xsl:sort select="."/>
</xsl:apply-templates>
</categories>
</xsl:template>
<xsl:template match="text[normalize-space() != '']">
<category type="{ancestor::entrydata/@name}">
<xsl:value-of select="."/>
</category>
</xsl:template>
</xsl:stylesheet>
最初の例が機能しないのに、2 番目の例が機能する理由を誰かが説明できますか。