在XSLT中拆分和连接字符串

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