计算某些内容出现在xml文档的其他部分中的次数

时间:2011-01-10 18:23:50

标签: xml xslt xslt-2.0

假设我有一个像这样的xml文件:

<root>
 <a><b><c> w </c></b></a>
 <x><y><z> w </z></y></x>
 <x><y><z> w </z></y></x>

和像这样的xsl行:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
     <xsl:value-of select="count( ./a/b[c = ./x/y/z] )"/>
  </xsl:template>
</xsl:stylesheet>

结果是0(我希望它是2:)

这只是我正在尝试做的一个简化示例。基本上我想计算来自'a / b / c'的东西出现在文档的其他部分中的次数,正如你所看到的,我做错了什么

2 个答案:

答案 0 :(得分:2)

使用

/*/x/y/z[. = current()/a/b/c]

这意味着

选择所有/*/x/y/z个元素,其字符串值等于current()/a/b/c个元素之一的字符串值。

注意标准XSLT函数current()计算当前节点(已选择模板的节点,或{{1}正文的节点正在应用。

答案 1 :(得分:1)

我熟悉XSLT 1.0;但是我在这里看到的两件事情都是关闭的:

  • 你在计算符合某些标准的“c”;但是只有一个c - 你想要计算“z”。
  • 您正在 b 的上下文中评估./x/y/z/,而不是在 root 的上下文中 - 因此xpath没有按预期执行。

在XSLT 1.0中(可能在2.0中没有多少ado):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
     <xsl:variable name="self" select="."/>
     <xsl:value-of select="count(x/y/z[. = $self/a/b/c] )"/>
  </xsl:template>
</xsl:stylesheet>

在您的真实代码中,可能更清楚的是不定义指向/root的变量,而是直接存储您正在寻找的字符串:<xsl:variable name="val" select="a/b/c"/>;无论哪种方式都可以。