0

我有以下示例 XML:

<block>
    <see link="IDNUMBER-1">(<i>See:</i> IDNUMBER-1</see>; <see link="IDNUMBER-2"> IDNUMBER-2)</see>
    <see link="IDNUMBER-3">(<i>See:</i> IDNUMBER-3)</see>
</block>

我应该将这些<see>元素链接到它们各自的页面,但只有IDNUMBER 文本 - 换句话说,“See:”部分以及括号根本不应该是可点击的。

好的部分是该link属性始终与需要可点击的文本相同。

到目前为止,我有这个代码:

<xsl:template match="see">
    <a>
       <xsl:attribute name="href">
           <xsl:value-of select="concat('#', @link)"/>
       </xsl:attribute>      
       <xsl:apply-templates/>
    </a>
</xsl:template>

虽然这是“正确的”,但它使整个东西都可以点击。我可以以某种方式指示 XSLT 排除“See:”部分,或者使其最初仅使link属性(即其相关文本)可单击?

编辑:XSLT 1.1 版

4

1 回答 1

1

您可以做什么,而不是在see上匹配,而是在其文本节点上匹配,但仅在文本包含链接属性的地方

<xsl:template match="see/text()[contains(., ../@link)]">

这意味着它不会匹配仅包含单个括号的文本节点,例如。

但是,它显然会匹配文本节点“IDNUMBER-2)”,但您可以使用substring-beforesubstring-after函数在链接的任一侧输出这些。

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:template match="see/text()[contains(., ../@link)]">
        <xsl:value-of select="substring-before(., ../@link)" />
        <a href="#{../@link}">
           <xsl:value-of select="../@link" />
        </a>
        <xsl:value-of select="substring-after(., ../@link)" />
    </xsl:template>
</xsl:stylesheet>

请注意在此处输出href属性时使用了属性值模板。花括号表示要计算的表达式,而不是字面输出,并使代码更加简洁易读。

于 2013-11-01T17:40:14.713 回答