2012-07-28 45 views
6

我想知道是否可以使用analyze-string并在RegEx中设置多个组,然后将所有匹配组存储在变量中以供稍后使用。XSL分析字符串 - >匹配子字符串到多个变量

像这样:

<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,效率不高,我应该能够处理正则表达式并存储所有组以备后用。

任何想法?

回答

6

以及是否

<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元素与捕获序列。

+0

稍后我将如何访问这些值? 我习惯了使用$ varname 你是否可以像数组一样访问这些数据?我需要稍后使用值如果测试 – TheStoneFox 2012-07-28 15:25:14

+0

您可以访问'$ groups [1]/x','$ groups [1]/y','$ groups [2]/x','$ groups [2 ]/y'等等。你当然也可以进一步处理元素,例如''或apply-templates例如''。 – 2012-07-28 16:25:19

+0

这是一种享受,非常感谢! – TheStoneFox 2012-07-28 16:51:53

5

此转换表明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()生成的序列中的每个项目都可以很容易地分配给相应的变量。

我们不需要找到想要的结果埋在一个温度。树 - 我们只是把它们全部放入结果序列

+1

的确非常有效。 +1 – conciliator 2012-11-05 12:07:17