我想知道是否可以使用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的每个组来说,这似乎很糟糕,效率不高,我应该能够处理一次正则表达式并存储所有组以供以后使用。
有什么想法吗?
答案 0 :(得分:8)
好吧
<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
元素。
答案 1 :(得分: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()
分配给相应的变量。
我们无需在温度中找到想要的结果。树 - 我们只是在结果序列中得到它们。