Xml 具有多个条件的小型XPath

Xml 具有多个条件的小型XPath,xml,xpath,Xml,Xpath,我使用XPath处理XML文档,其中特定元素的大小写在不同的文档中可能有所不同(不要问;我不控制文档的生成) 为了处理此问题,我的一个XPath查询如下所示: //group[group='Foo']/subGroup[sub='Bar' or Sub='Bar'] | //group[group='Foo']/SubGroup[sub='Bar' or Sub='Bar'] 请注意,子组元素可以出现为子组或子组,而子元素可以显示为子或子 有没有办法缩短这个XPath 我有多个与此类似的查询,

我使用XPath处理XML文档,其中特定元素的大小写在不同的文档中可能有所不同(不要问;我不控制文档的生成)

为了处理此问题,我的一个XPath查询如下所示:

//group[group='Foo']/subGroup[sub='Bar' or Sub='Bar'] | //group[group='Foo']/SubGroup[sub='Bar' or Sub='Bar']
请注意,
子组
元素可以出现为
子组
子组
,而
元素可以显示为

有没有办法缩短这个XPath


我有多个与此类似的查询,但有效地复制或扩展了
子部分(例如
[a='b'和(sub='Bar'或sub='Bar'))
子组
子组
的差异以及
子组
子组
的差异在大多数查询中都存在,即使
//group[group='Foo']
部分不同。

唉,它不那么长,但肯定不那么难看

//group[group='Foo']/*[self::subGroup | self::SubGroup][sub='Bar' or Sub='Bar']

其他变体将依赖于
translate()
name()
,如Marvin Smit在中概述。

这是在
XPath 1.0
还是
XPath 1.1
?有很大区别。.我使用的是VTD-XML,它说它支持XPath 1.0的一些XPath 2.0特性。也就是说,它是大写(),小写(),以()结尾对于XPath 1.0,您可以使用转换函数i.c.m.local-name()。这是假设条件轴是属性而不是元素,但想法保持不变。//group[@group='Foo']/*[translate(local-name(),'s','s')='SubGroup'][@sub='Bar'或@sub='Bar']它是所有元素;没有属性。不难看,没有,但肯定有帮助。@Steven只是关于
*[self::subGroup | self::subGroup]
:实际上它应该是
*[self::subGroup或self::subGroup]
,因为联合(
)生成节点集而不是布尔值。但是,它是互斥节点的并集(节点不能同时是
),因此它最终成为一个节点集,要么正好包含一个节点,要么是空的。非空节点集的计算结果为
true
,因此我们可以在这里将其用作谓词。保存一个字符确实是一个小技巧。;)