具有XPath的唯一ID和多个类

reb*_*ion 3 xslt xpath replace class unique

我正在使用XSLT显示ul包含li和的菜单a.

我想要以下内容:

  1. 找到第一个li a元素并添加.firstitem该类.
  2. 找到最后一个li a元素并添加.lastitem该类.
  3. 找到活动li a元素并添加.active类.
  4. 为每个li a元素添加唯一ID .(即URL友好的菜单文本作为ID).

我已成功完成步骤1-3的工作.除了当我尝试添加类时,它实际上替换了其他类而不是添加它们.

这是代码:

<li>
    <a>
        <!-- Add .firstitem class -->
        <xsl:if test="position() = 1">
            <xsl:attribute name="class">firstitem</xsl:attribute>
        </xsl:if>

        <!-- Add .lastitem class -->
        <xsl:if test="postition() = count(//Page)">
            <xsl:attribute name="class">lastitem</xsl:attribute>
        </xsl:if>

        <!-- Add .active class -->
        <xsl:if test="@Active='True'">
            <xsl:attribute name="class">active</xsl:attribute>
        </xsl:if>

        <!-- Add link URL -->
        <xsl:attribute name="href"><xsl:value-of select="@FriendlyHref" disable-output-escaping="yes"/></xsl:attribute>

        <!-- Add link text -->
        <xsl:value-of select="@MenuText" disable-output-escaping="yes"/>
    </a>
</li>
Run Code Online (Sandbox Code Playgroud)

实际上,a元素可以包含所有这三个类.但是,通过代码,它将替换class属性中的所有内容.如何添加类而不是替换它们?

我列表中的第4步是获取一个唯一的ID,最好是基于@MenuText.我知道有一个replace()功能,但我无法让它工作,我的编辑说这replace()不是一个功能.

菜单项文本包含空格,短划线和其他符号,这些符号在id属性中无效.我该如何更换这些符号?

Mar*_*man 6

<a>
       <xsl:attribute name="class">
            <!-- Add .firstitem class -->
            <xsl:if test="position() = 1">
                <xsl:text> firstitem</xsl:text>
            </xsl:if>
            <!-- Add .lastitem class -->
            <xsl:if test="postition() = count(//Page)">
                <xsl:text> lastitem</xsl:text>
            </xsl:if>

            <!-- Add .active class -->
            <xsl:if test="@Active='True'">
                <xsl:text> active</xsl:text>
           </xsl:if>
       </xsl:attribute>

        <!-- Add link URL -->
        <xsl:attribute name="href"><xsl:value-of select="@FriendlyHref" disable-output-escaping="yes"/></xsl:attribute>

        <!-- Add link text -->
        <xsl:value-of select="@MenuText" disable-output-escaping="yes"/>
    </a>
Run Code Online (Sandbox Code Playgroud)

replace()是一个XSLT2.0函数.使用XSLT1.0时,您需要一个自定义模板来执行大多数字符串操作.