2

是否有一个简洁的 XPath 表达式来计算一组节点的字符串标记?例如;

<set>
  <hi>hello, there, world</hi>
  <hi>foo, bar</hi>
</set>

对于上面的例子,我想要的答案是 value 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)

4

3 回答 3

3

您将需要 XPath 2.0 或 XQuery 1.0 的表达能力,就像count(/set/hi/tokenize(., ', '))使用单个表达式一样。

使用 XSLT 1.0,您需要对值进行迭代和求和,可能使用结果树片段作为中间结果的数据结构,然后将其转换(使用exsl:node-set)转换为节点集以总结各个部分。

于 2013-07-19T17:28:54.020 回答
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>
于 2013-07-19T18:26:04.030 回答
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, ', '))"/>
于 2013-07-19T19:24:34.523 回答