在XSLT中拆分和连接字符串

时间:2013-02-25 14:43:37

标签: xslt xslt-2.0

您好我在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

由于

1 个答案:

答案 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