XSL Analyze-String -> 匹配子字符串到多个变量

8
我想知道是否可以使用analyze-string在正则表达式中设置多个组,然后将所有匹配的组存储在变量中以供以后使用。
例如:
<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,这似乎很愚蠢,效率也不高,我应该能够一次处理正则表达式并存储所有组以供以后使用。

有什么想法吗?

2个回答

10

好吧

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


我之后该如何访问这些值?我习惯使用$变量名您是否像访问数组一样访问它们?我需要在if测试中稍后使用这些值。 - TheStoneFox
您可以访问$groups[1]/x$groups[1]/y$groups[2]/x$groups[2]/y等等。当然,您也可以进一步处理元素,例如<xsl:for-each select="$groups[x = 1]"><xsl:value-of select="y"/></xsl:for-each>或应用模板,例如<xsl:apply-templates select="$groups[x = 100]"/> - Martin Honnen

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组的定界字符串组成,然后我们对由tokenize()生成的序列中的每个项进行标记,可以轻松将序列中的每个项目分配给相应的变量。 我们不必在临时树中找到想要的结果 - 我们只需在结果序列中获取所有结果

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接