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

2019-07-30 16:18发布

我想知道是否可以使用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中的变量,但似乎愚蠢,对于每一个组我必须处理的正则表达式,不是很有效,我应该能够一次处理正则表达式和存储所有组的使用以后。

有任何想法吗?

Answer 1:

那么做

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



Answer 2:

这一转变表明, 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

在这里,我们不依靠知道正则表达式(可提供作为参数)和字符串-我们只是用正则表达式组的分隔字符串,然后我们记号化和所产生的序列中的每一项替换字符串tokenize()可以容易地被分配到相应的变量。

我们没有发现埋在一个临时想要的结果。 树-我们只是拿它们都在一个结果序列



文章来源: XSL Analyze-String -> Matching-Substring into multiple variables
标签: xslt xslt-2.0