2

我有这个字符串(实际上是无限的):

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

现在,我想要这个结果:

e00-100

e01-90

e02-0

...

字符串总是以 ;] 结尾

如何使用正则表达式(使用 function <xsl:analyze-string select="$string" regex="..."> <xsl:matching-substring>...)执行此操作?

非常感谢您的帮助!

4

1 回答 1

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>

或分析字符串,例如

<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>
于 2013-11-15T11:28:45.320 回答