我有一个简单的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;,我想打印值12345
和88555
。
上面的代码只会打印匹配的整个当前NODE。
此外,我需要获得不同的价值观。例如。 xxx 12345
,yyy 56789
,zzz 12345
我需要结果为12345
和56789
。
匹配模式是实现此目的的最佳方式吗?我快速得到了我的初始(正确)节点集,但是停滞不前。
答案 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