XSLT 2.0 - 正则表达式无限

时间:2013-11-15 11:12:59

标签: xml regex xslt

我有这个字符串(几乎是无限的):

[e00-100; e01-90; e02-0; e03-0; ...;]

现在,我想要这个结果:

e00-100

e01-90

e02-0

...

字符串完成始终使用;]

如何使用正则表达式(使用函数<xsl:analyze-string select="$string" regex="..."> <xsl:matching-substring>...)?

执行此操作

谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

如果你使用<xsl:value-of select="tokenize(replace(replace($string, '^\[', ''), ';\]$', ''), ';')" separator="&#10;&#10;"/>,它就足以在每条线上输出令牌。

如果您想按照评论中的说明包装令牌,那么您可以使用

<xsl:for-each select="tokenize(replace(replace($string, '^\[', ''), ';\]$', ''), ';')">
  <val><xsl:value-of select="."/></val>
</xsl:for-each>

或analyze-string例如

<xsl:analyze-string select="$string" regex="(e[0-9]+-[0-9]+);">
  <xsl:matching-substring>
    <val><xsl:value-of select="regex-group(1)"/></val>
  </xsl:matching-substring>
</xsl:analyze-string>

这是一个完整的例子:

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output indent="yes"/>

<xsl:param name="string" select="'[e00-100;e01-90;e02-0;e03-0;]'"/>

<xsl:template name="main">
  <results>
    <result-tokenize>
      <xsl:for-each select="tokenize(replace(replace($string, '^\[', ''), ';\]$', ''), ';')">
        <val><xsl:value-of select="."/></val>
      </xsl:for-each>
    </result-tokenize>
    <result-as>
      <xsl:analyze-string select="$string" regex="(e[0-9]+-[0-9]+);">
        <xsl:matching-substring>
          <val><xsl:value-of select="regex-group(1)"/></val>
        </xsl:matching-substring>
      </xsl:analyze-string>    
    </result-as>
  </results>
</xsl:template>

</xsl:stylesheet>

输出(使用Saxon 9.5 HE测试)

<results>
   <result-tokenize>
      <val>e00-100</val>
      <val>e01-90</val>
      <val>e02-0</val>
      <val>e03-0</val>
   </result-tokenize>
   <result-as>
      <val>e00-100</val>
      <val>e01-90</val>
      <val>e02-0</val>
      <val>e03-0</val>
   </result-as>
</results>