8

我想知道是否可以analyze-string在 RegEx 中使用和设置多个组,然后将所有匹配的组存储在变量中以供以后使用。

像这样:

<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
  <xsl:matching-substring>
    <xsl:variable name="varX">
      <xsl:value-of select="regex-group(1)"/>
    </xsl:variable>                                
    <xsl:variable name="varY">
      <xsl:value-of select="regex-group(2)"/>
    </xsl:variable>        
  </xsl:matching-substring>
</xsl:analyze-string>    

这实际上不起作用,但这就是我所追求的那种东西,我知道我可以将它包装analyze-string在一个变量中,但这似乎很愚蠢,对于每个组我都必须处理 RegEx,效率不高,我应该是能够处理一次正则表达式并存储所有组以供以后使用。

有任何想法吗?

4

2 回答 2

9

不错

<xsl:variable name="groups" as="element(group)*">
<xsl:analyze-string regex="^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee" select=".">
<xsl:matching-substring>
  <group>
     <x><xsl:value-of select="regex-group(1)"/></x>
     <y><xsl:value-of select="regex-group(2)"/></y>
  </group>   
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>

帮助?这样你就有了一个名为的变量,它是一个带有捕获groups的元素序列。group

于 2012-07-28T12:06:50.660 回答
6

这种转换表明,xsl:analyze-string获得想要的结果并不是必需的——存在一个更简单和通用的解决方案。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="*[matches(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee')]">

    <xsl:variable name="vTokens" select=
      "tokenize(replace(., '^Blah\s+(\d+)\s+Bloo\s+(\d+)\s+Blee', '$1 $2'), ' ')"/>

  <xsl:variable name="varX" select="$vTokens[1]"/>  
  <xsl:variable name="varY" select="$vTokens[2]"/>  

  <xsl:sequence select="$varX, $varY"/>
 </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时

<t>Blah  123   Bloo  4567  Blee</t>

这会产生想要的正确结果

123 4567

在这里,我们不依赖于知道 RegEx(可以作为参数提供)和字符串——我们只是用 RegEx 组的分隔字符串替换字符串,然后我们对其进行标记,并且tokenize()可以轻松地生成序列中的每个项目分配给相应的变量。

我们不必在临时文件中找到想要的结果。树——我们只是把它们都放在一个结果序列中

于 2012-07-28T16:19:50.520 回答