如果引入新信件,如何添加属性?

时间:2015-12-06 19:35:47

标签: xml xslt

我有这个非常简单的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 之外的所有条目都会得到这样的类。

有什么想法吗?

感谢您的帮助。

3 个答案:

答案 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>