【发布时间】:2010-08-17 12:51:55
【问题描述】:
XML:
<?xml version="1.0" encoding="windows-1251"?>
<mode>
<term>
<name>abhdk</name>
</term>
<term>
<name>njhjsu</name>
</term>
<term>
<name>sdasd</name>
</term>
<term>
<name>vbvbcd</name>
</term>
...
</mode>
<mode>
<term>
<name>asdfd</name>
</term>
<term>
<name>vcbbn</name>
</term>
<term>
<name>bnmbnmb</name>
</term>
<term>
<name>tyutyu</name>
</term>
<term>
<name>ghjghj</name>
</term>
<term>
<name>hjk</name>
</term>
...
</mode>
<mode>
<term>
<name>asdfd</name>
</term>
<term>
<name>vcbbn</name>
</term>
</mode>
...
我需要像这样做字母索引:
我从这里获取模板:link text
我的问题:对于每个mode,都必须有自己的“字母索引”列表(对于单一模式,它可以完美运行)。
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="windows-1251"/>
<xsl:for-each select="mode">
<xsl:call-template name="alphabetIndexTmpl">
<xsl:with-param name="key-name" select="'items-key'" />
...
</xsl:call-template>
</xsl:for-each>
<xsl:key name="items-key" match="term" use="substring(., 1, 1)" />
<xsl:template name="alphabetIndexTmpl">
<xsl:param name="key-name"/>
...
</xsl:template>
</xsl:stylesheet>
此代码无法正常工作。 它必须像这样更正:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="windows-1251"/>
<xsl:for-each select="mode">
<xsl:call-template name="alphabetIndexTmpl">
<xsl:with-param name="key-name" select="concat('items-key', position())" />
...
</xsl:call-template>
</xsl:for-each>
<xsl:key name="items-key1" match="mode[1]/term" use="substring(., 1, 1)" />
<xsl:key name="items-key2" match="mode[2]/term" use="substring(., 1, 1)" />
<xsl:key name="items-key3" match="mode[2]/term" use="substring(., 1, 1)" />
...
<xsl:template name="alphabetIndexTmpl">
<xsl:param name="key-name"/>
...
</xsl:template>
</xsl:stylesheet>
但这是一个非常错误的决定。
如何更优雅地解决这个问题?
Dimitre Novatchev,不要因为“不准确”而击败我,我放弃了我的武器))。
【问题讨论】:
-
+1 请求 Dimitre 宽恕 :)
-
好问题 (+1)。有关演示使用 Muenchian 方法与复合键进行分组的解决方案,请参阅我的答案。
标签: xslt alphabetical