我想知道是否可以使用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
中的变量,但似乎愚蠢,对于每一个组我必须处理的正则表达式,不是很有效,我应该能够一次处理正则表达式和存储所有组的使用以后。
有任何想法吗?
那么做
<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
与捕获的元素。
这一转变表明, 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()
可以容易地被分配到相应的变量。
我们没有发现埋在一个临时想要的结果。 树-我们只是拿它们都在一个结果序列 。