2011-11-24 203 views
0

的另一部分参考前面一点,我想专注于某些元素并对其进行分析:的XPath 2.0:在一个XPath XPath表达式

... 
<field>aaa</field> 
... 
<field>bbb</field> 
... 
<field>aaa (1)</field> 
... 
<field>aaa (2)</field> 
... 
<field>ccc</field> 
... 
<field>ddd (7)</field> 

我想找到谁是文本内容的元素(除一个可能的枚举,有独特之处在于将BBB,CCC和DDD的aboce例如

以下XPath给了我独特的价值观:。

distinct-values(//field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '('))) 

现在我想的程度,一个nd在所有不同的值上执行另一个XPath,这将计算有多少字段以其中任何一个开始,并且检索那些数量大于1的人。

这些可以是等于该特定值的字段内容价值,或者它开始与价值并且跟随“(”。问题是在该XPath的第二部分中,我将同时参考该部分本身的上下文和前一个上下文。

在下面的XPath中,我会 - 而不是使用“。”。作为上下文使用c_outer和c_inner:

distinct-values(//field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '(')))[count(//field[(c_inner = c_outer) or starts-with(c_inner, concat(c_outer, ' ('))]) > 1] 

我不能使用“。”因为两个显而易见的原因。但是我怎么能够从内部表达中的外部表达中引用一个特定的或当前独特的价值呢?

这甚至可能吗?

回答

0

XQuery可以做到这一点,例如

for $s 
    in distinct-values(
    //field[matches(normalize-space(.), ' \([0-9]\)$')]/substring-before(., '('))) 
    where count(//field[(. = $s) or starts-with(., concat($s, ' ('))]) > 1 
    return $s 
+0

我没看尝试carrefully,但我相信你可以使用XPath 2.0有两个succesive for循环做,这样的:为$ S 在不同的值( //场[匹配( (。,'(')),$ y在//字段[(。=。$ s)或开始字段中的标准化空间(。),'\([0-9] \) (。,concat($ s,'('))] return $ s [count($ y)> 1] –