我如何过滤我的XML列表,以避免得到不区分大小写的重复字母



我有一些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>

相关内容

  • 没有找到相关文章

最新更新