在XPATH中,使用当前上下文中的数据来过滤其他数据

时间:2009-08-28 01:10:42

标签: xpath

有没有办法使用当前上下文中的数据来过滤statsource中其他位置的节点。

例如,如果我有这个XML:

<root>
    <group1>
        <inst>
            <type>Foo</type>
            <value>First Foo</value>
        </inst>
        <inst>
            <type>Bar</type>
            <value>The Bar</value>
        </inst>
        <inst>
            <type>Foo</type>
            <value>Second Foo</value>
        </inst>
    </group1>
    <group2>
        <Filter>
            <FilterType>Foo</FilterType>
        </Filter>
        <Filter>
            <FilterType>Bar</FilterType>
        </Filter>
    </group2>
</root>

假设我的上下文是Filter标记之一,我想返回获取group1中指定类型的实例数。我想编写看起来像这样的XPATH:

count(/root/group1/inst[type = **FilterType**])

我可以使用任何东西在原始上下文中获取FilterType吗?

2 个答案:

答案 0 :(得分:1)

这可以在XPath 2.0中轻松完成

for $type in /*/*/Filter[1]/FilterType
  return 
     count(/*/group1/*[type eq $type])

当针对提供的XML文档评估此Xpath表达式时,将返回正确的结果:

<强> 2

在XPath 1.0中,如果事先知道group1/inst个元素的数量,并且$ vType代表有问题的FilterType,那么可以构造以下XPath 1.0表达式:

  ($vType = /*/group1/inst[1]/type)
 +
  ($vType = /*/group1/inst[2]/type)
 +
  ($vType = /*/group1/inst[3]/type)

再次产生:

2

最后,如果在XSLT中需要XPath 1.0表达式并且“Filter”是当前节点,

然后以下XPath表达式计算确切的匹配数:

  count(/*/group1/inst[type = curent()/FilterType])

答案 1 :(得分:0)

我正在寻找解决同样问题的方法。目前,我正在使用变量来绕过这个...它看起来像下面的

<xsl:variable name='FilterType'><xsl:value-of select='FilterType'/></xsl:variable>
<xsl:value-of select='count(/root/group1/inst[type = $FilterType])'/>

但必须有更好的方法。