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

谢谢

4

1 回答 1

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))"/>

这会给你你的腹肌

最后,您可以使用tokenize函数来拆分2,3。在您的 XSLT 中,您似乎也在寻找连字符,但 tokenize 函数也使用正则表达式,所以这不是问题。您可以做的只是标记字符串,然后使用文本变量作为分隔符重新加入它

  <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
于 2013-02-25T23:08:24.313 回答