您好我在XML下面有以下行,我还需要一个数字的超链接。我希望此输出以HTML格式显示。
<main>
<alph>a b 2,3</alph>
</main>
我想要一个提供输出的XSLT:
a b 2, a b 3
我尝试了以下XSLT:
<xsl:template match="alph">
<xsl:variable name="link" select="normalize-space(translate(
normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/>
<xsl:value-of select="substring-before(normalize-space(.),$link)"/>
<xsl:variable name="tex">
<xsl:value-of select="text()"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains($link,',')">
<xsl:variable name="new">
<xsl:value-of select="tokenize($link,',')"/>
</xsl:variable>
<xsl:value-of select="concat($new,$tex)"/>
</xsl:when>
<xsl:when test="contains($link,'-')">
<xsl:value-of select="tokenize($link,'-')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$link"/>
</xsl:otherwise>
</xsl:choose>
但是它给我的输出为:
a b 2 3a b 2,3
由于
答案 0 :(得分:1)
您遇到的一个问题是变量链接
<xsl:variable name="link" select="normalize-space(translate(
normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/>
看起来您正在尝试从字符串中删除所有字母字符,因此您只剩下 2,3 。但是,为了实现这一点,需要将 abc ... xyz 括在撇号中,否则它将寻找名为 abc ... xyz 的元素。话虽如此,你说你正在使用XSLT2.0,所以你可以在这里使用 replace 函数,它将一个正则表达式作为参数
<xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/>
接下来,您可以在此链接之前获取文字,如此
<xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/>
这会为您提供 a b
最后,您可以使用 tokenize 功能拆分 2,3 。在您的XSLT中,您似乎也在寻找连字符,但tokenize函数也使用正则表达式,因此这不是问题。你可以做的只是标记字符串,并使用 text 变量作为分隔符重新加入它
<xsl:value-of select="concat($text, ' ')"/>
<xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/>
这是完整的XSLT
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="alph">
<xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/>
<xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/>
<xsl:value-of select="concat($text, ' ')"/>
<xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/>
</xsl:template>
</xsl:stylesheet>
在XML上应用时,输出以下内容
a b 2, a b 3