【发布时间】:2012-07-16 10:39:26
【问题描述】:
好的,基于这个问题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>
我做错了什么?
编辑:
似乎仅基于<entrydata> 的第一个<text> 值而不是所有<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>
谁能解释一下为什么第一个例子不起作用,而第二个例子起作用。
【问题讨论】: