1

我有一个相当大的测试检查顺序,我想忽略baz属性attri等于的元素y,这是我尝试过的,但它似乎无法正常工作。baz无论属性如何,它似乎都被忽略了:

语境:

jd:foo|jd:bar|jd:baz[@attri != 'y']|jd:bam

测试:

        (name()='foo' and 
          (preceding-sibling::*[local-name()='bar']
           or preceding-sibling::*[local-name()='baz' and @attri != 'y']
           or preceding-sibling::*[local-name()='bam']
          )
       ) or
       (name()='bar' and 
          (preceding-sibling::*[local-name()='baz' and @attri != 'y']
           or preceding-sibling::*[local-name()='bam']
          )
       ) or
       (name()='baz' and 
          (preceding-sibling::*[local-name()='bam']
          )
       )
4

1 回答 1

2

您的上下文不仅排除baz了包含@attri等于的元素,y还排除了baz包含属性的元素。这个:

jd:baz[@attri != 'y']

baz 必须有一个@attri属性,它也不能是y。因此,诸如此类的节点<baz>...</baz>不会成为上下文的一部分,因为它不包含该属性。这将包括在上下文元素中,如<baz attri='z'>.

如果您只想排除<baz attri='y'>元素(但不排除没有该属性的元素),则必须使用:

baz[not(@attri = 'y')]

它选择所有baz具有@attri='y'并否定该集合的元素。这包括没有@attri属性的元素。

如果要考虑没有属性的元素,这同样适用于您的测试。

于 2014-06-02T20:18:32.703 回答