Split and concatenate a string in XSLT
您好,我在XML中加入了以下内容,并且我还需要一个超链接来输入号码。我希望此输出以HTML格式显示。
1 2 3 | <main> a b 2,3</alph> </main> |
我想要一个输出为以下内容的XSLT:
1 | a b 2, a b 3 |
我尝试了以下XSLT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <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> |
但是它给我的输出是:
1 | a b 2 3a b 2,3 |
谢谢
您遇到的一个问题是变量link
1 2 | <xsl:variable name="link" select="normalize-space(translate( normalize-space(current()),abcdefghijklmnopqrstuvwxyz,''))"/> |
您似乎正在尝试从字符串中删除所有字母字符,因此只剩下2,3。但是,要使其正常工作,需要将abc ... xyz括在撇号中,否则它将寻找名为abc ... xyz的元素。话虽如此,您说您正在使用XSLT2.0,因此您可以在此处使用replace函数,该函数将正则表达式作为参数
1 | <xsl:variable name="link" select="normalize-space(replace(current(),'[a-z]',''))"/> |
接下来,您可以在此链接之前获取文本,就像这样
1 | <xsl:variable name="text" select="normalize-space(substring-before(current(), $link))"/> |
这会给你一个b
最后,您可以使用标记化功能来拆分2,3。在您的XSLT中,您似乎也在寻找连字符,但是tokenize函数也使用正则表达式,因此这不是问题。您可以做的只是将字符串标记化,然后使用text变量作为分隔符重新连接它
1 2 | <xsl:value-of select="concat($text, ' ')"/> <xsl:value-of select="tokenize($link,',|-')" separator="{concat(', ', $text, ' ')}"/> |
这是完整的XSLT
1 2 3 4 5 6 7 8 9 | <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上应用时,输出以下内容
1 | a b 2, a b 3 |