我有一些XML,有一个按字母顺序排序的字符串列表。我想生成一组div,其中包含每个集合的首字母,且首字母不重复。
XML><?xml version="1.0" encoding="UTF-8"?>
<textstring>
<example>Delta</example>
<example>delta2</example>
<example>harmony</example>
<example>incognito</example>
<example>Inconvenient</example>
</textstring>
XSL
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="textstring">
<xsl:apply-templates mode="trick" select="/textstring/example"/>
</xsl:template>
<xsl:template match="/textstring/example" mode="trick">
<xsl:variable name="firstLetter" select="substring(text(),1,1)"/>
<div>
<xsl:copy-of select="$firstLetter"/>
</div>
</xsl:template>
</xsl:stylesheet>
D
d
h
i
I
期望输出值
D
H
I
我在想一些可以添加到select的东西,比如
<xsl:template match="textstring">
<xsl:apply-templates mode="trick" select="/textstring/example[not(starts-with(
substring(
translate(text(),
'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') ,1,1),
substring(following-sibling::example[
translate(text(),
'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') ],1,1)
))]"/>
</xsl:template>
但是结果是
D
d
h
我完全错了吗?我真的不想切换到for-each循环,因为它有点资源密集型,但是检查前面的兄弟真的不那么重要吗?
正如评论中所说,您应该使用Muenchian方法。参见下一个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="html" encoding="UTF-8" indent="yes"/>
<xsl:key name="first-letters" match="example" use="substring(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 1, 1)" />
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="textstring">
<xsl:apply-templates select="example[generate-id() = generate-id(key('first-letters', substring(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 1, 1))[1])]" />
</xsl:template>
<xsl:template match="example">
<div>
<xsl:value-of select="substring(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 1, 1)" />
</div>
</xsl:template>
</xsl:stylesheet>
这将生成所需的输出:
<div>D</div>
<div>H</div>
<div>I</div>