如何简化这个Xpath表达式?

时间:2011-01-14 12:43:07

标签: xpath expression xslt-1.0 reduction

我有以下XML代码:

<root>
   <a><l_desc/></a>
   <b><l_desc>foo</l_desc></b>
   <c><l_desc>bar</l_desc></c>
</root>

我想将 l_desc 节点与 a b 节点作为父节点进行匹配。
现在,我使用这个xpath表达式://a/l_desc/.. | //b/l_desc/..

我更喜欢这样写://(a|b)/l_desc/.. 不幸的是,这个表达式无效。

你有没有想过减少第一个表达式? xpath将用于XSLT样式表v1.0。

斯蒂芬

4 个答案:

答案 0 :(得分:3)

  

我希望将l_desc个节点与之匹配   a或b节点作为父

更简单:

/root/a/l_desc | /root/b/l_desc

/root/*[self::a | self::b]/l_desc

启动//运算符(设计错误,未知架构):

//a/l_desc | //b/l_desc

或者

//*[self::a | self::b]/l_desc

在XPath 2.0中,有效

/root/(a|b)/l_desc

答案 1 :(得分:1)

你可以在这里使用谓词

l_desc[../a|../b]

答案 2 :(得分:1)

怎么样

//l_desc[parent::a or parent::b]

答案 3 :(得分:1)

使用:

/*/*[self::a or self::b]/l_desc

这意味着:选择所有l_desc个元素,这些元素是任何ab元素的子元素,它们本身就是XML的顶级元素的子元素文档。

<强>避免

  1. 在您了解文档结构时使用//缩写//可能效率很低。

  2. 在不需要时使用反向轴(例如parent::)。包含反向轴的表达式更难以理解,并且可能比仅包含正向轴的表达式效率低。