我有以下示例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版
答案 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 属性时使用属性值模板。花括号表示要计算的表达式,而不是字面输出,并使代码更简洁和可读。