是否有一个整洁的XPath表达式来计算一组节点的字符串标记?例如;
<set>
<hi>hello, there, world</hi>
<hi>foo, bar</hi>
</set>
我想要的上述示例的答案是值5
。第一个<hi>
有3个令牌。第二个<hi>
有2个令牌。
<set>
可以包含任意数量的<hi>
个节点,每个节点可以包含任意数量的令牌。标记是由逗号后跟空格分隔的字符串。
我试过了;
<xsl:value-of select="count(str:tokenize(/set//hi, ', '))"/>
但是返回第一个节点的标记数,即。 3
。
我正在使用XSLT 1.0。 (PHP libxml版本2.7.3)
答案 0 :(得分:2)
您需要使用XPath 2.0或XQuery 1.0(如count(/set/hi/tokenize(., ', '))
)的强大功能来完成单个表达式。
使用XSLT 1.0,您需要迭代并总结这些值,可能使用结果树片段作为中间结果的数据结构,然后将其转换(使用exsl:node-set
)到节点集以汇总件。
答案 1 :(得分:1)
根据你的定义
令牌是由逗号后跟空格分隔的字符串。
...你想要做的就是计算逗号的数量,并为每个字符串添加1。
这是一个在XSLT 1.0中有效的黑客,它利用了translate()
成语,有时证明是有用的。想想它正在做什么(这需要一点时间才能成为习惯用户的第一次使用者。)
T:\ftemp>type commas.xml
<set>
<hi>hello, there, world</hi>
<hi>foo, bar</hi>
</set>
T:\ftemp>xslt commas.xml commas.xsl
5
T:\ftemp>type commas.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="set">
<xsl:variable name="commas">
<xsl:for-each select="hi">
<xsl:value-of select="translate(.,translate(.,',',''),'')"/>
<xsl:text>,</xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="string-length($commas)"/>
</xsl:template>
</xsl:stylesheet>
T:\ftemp>
答案 2 :(得分:1)
这在XPath 2.0中很简单,但遗憾的是在XPath 1.0中需要一些额外的工作。有很多方法可以通过额外的步骤来实现。这是我要使用的那个:
<xsl:variable name="tmp">
<xsl:for-each select="//hi">
<xsl:value-of select="concat(., ', ')"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="count(str:tokenize($tmp, ', '))"/>