仅链接节点中的特定文本

时间:2013-11-01 16:41:35

标签: xml xslt xpath

我有以下示例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:”部分以及paranthesis不应该完全可以点击。

好的部分是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版

1 个答案:

答案 0 :(得分:1)

您可以执行的操作,而不是参见上的匹配,匹配其文本节点,但仅限于文本包含链接属性的位置

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

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

但是,它显然会匹配文本节点“IDNUMBER-2)”,但您可以使用 substring-before substring-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 属性时使用属性值模板。花括号表示要计算的表达式,而不是字面输出,并使代码更简洁和可读。