XSL使用匹配和正则表达式

时间:2014-09-09 19:49:19

标签: regex xslt

我有一个简单的for-each语句,它使用正则表达式匹配节点。我在内部节点查找任何4位或更多位数的匹配。

<xsl:for-each select="//methods/body[matches(., '= \d{4}')]">
    <p><xsl:value-of select="." /></p>
</xsl:for-each>

我正在尝试获取匹配值的VALUE - 即如果NodeA包含&#34; xxxx yyyy 12345 zzzz&#34;并且NodeB包含&#34; aaa bb 88555 cccc&#34;,我想打印值1234588555

上面的代码只会打印匹配的整个当前NODE。

此外,我需要获得不同的价值观。例如。 xxx 12345yyy 56789zzz 12345我需要结果为1234556789

匹配模式是实现此目的的最佳方式吗?我快速得到了我的初始(正确)节点集,但是停滞不前。

1 个答案:

答案 0 :(得分:1)

对于测试,matches()效果很好。为了实际提取值,xsl:analyze-string更好。

示例...

XML输入

<doc>
    <x>xxxx yyyy 12345 zzzz</x>
    <x>aaa bb 88555 cccc</x>
    <x>xxxx yyyy 12345 zzzz aaa bb 88555 cccc</x>    
</doc>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <xsl:variable name="values">
            <xsl:for-each select="x[matches(.,'\d{4}')]">
                <xsl:analyze-string select="." regex="\d{{4}}">
                    <xsl:matching-substring>
                        <xsl:sequence select="."/>
                    </xsl:matching-substring>
                </xsl:analyze-string>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="distinct-values(tokenize($values,'\s'))" separator=", "/>
    </xsl:template>

</xsl:stylesheet>

<强>输出

1234, 8855