我有这个非常简单的XML:
<entries>
<entry>
<name>Allan</name>
</entry>
<entry>
<name>Ben</name>
</entry>
<entry>
<name>Brad</name>
</entry>
<entry>
<name>Charles</name>
</entry>
<entry>
<name>David</name>
</entry>
</entries>
我也有这个循环遍历所有条目的XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="entries">
<xsl:for-each select="entry">
<span>
<xsl:value-of select="."/>
</span>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
是否有一种简单的方法可以为每个以新字母开头的条目添加css类?
在上面的例子中,除 Brad 之外的所有条目都会得到这样的类。
有什么想法吗?
感谢您的帮助。
答案 0 :(得分:1)
这是一个分组问题,请参阅http://xsltransform.net/jyRYYit,它使用Muenchian grouping
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="group" match="entry" use="substring(name, 1, 1)"/>
<xsl:template match="entry[generate-id() = generate-id(key('group', substring(name, 1, 1))[1])]">
<span class="foo">
<xsl:apply-templates/>
</span>
</xsl:template>
<xsl:template match="entry[not(generate-id() = generate-id(key('group', substring(name, 1, 1))[1]))]">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:transform>
如果您想比较不区分大小写,则需要使用translate
:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="group" match="entry" use="translate(substring(name, 1, 1), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
<xsl:template match="entry[generate-id() = generate-id(key('group', translate(substring(name, 1, 1), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))[1])]">
<span class="foo">
<xsl:apply-templates/>
</span>
</xsl:template>
<xsl:template match="entry[not(generate-id() = generate-id(key('group', translate(substring(name, 1, 1), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))[1]))]">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:transform>
答案 1 :(得分:1)
在XSLT 2.0中:
<xsl:template match="entries">
<xsl:for-each-group select="entry"
group-by="substring(name, 1, 1)">
<span class="new-letter>
<xsl:value-of select="current-group()[1]"/>
</span>
<span class="same-letter>
<xsl:value-of select="current-group()[position() gt 1]"/>
</span>
</xsl:for-each-group>
</xsl:template>
答案 2 :(得分:1)
虽然可能被视为分组问题,但您也可以像说明的那样简单地看待它。这是假设条目已按您希望的顺序排序。
**Key value** Type
---------------------------------------
propertyKey1 propertyValue1 Child1
propertyKey2 propertyValue2 Child1
propertyKey3 propertyValue3 Child2
propertyKey4 propertyValue4 Child2
propertyKey5 propertyValue5 CommonPorperty
.. .. ..
propertyKeyn propertyValuen ..
要使其不区分大小写,请尝试:
<xsl:for-each select="entry">
<span>
<xsl:if test="not(starts-with(preceding-sibling::entry[1]/name, substring(name, 1 ,1)))">
<xsl:attribute name="class">foo</xsl:attribute>
</xsl:if>
<xsl:value-of select="."/>
</span>
</xsl:for-each>
定义后:
<xsl:for-each select="entry">
<span>
<xsl:if test="translate(substring(name, 1 ,1), $upper-case, $lower-case) != translate(substring(preceding-sibling::entry[1]/name, 1 ,1), $upper-case, $lower-case)">
<xsl:attribute name="class">foo</xsl:attribute>
</xsl:if>
<xsl:value-of select="."/>
</span>
</xsl:for-each>