XPath计算XSLT 1.0中几个节点的字符串标记总数?

时间:2013-07-19 17:17:35

标签: xslt xpath libxml2

是否有一个整洁的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)

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, ', '))"/>