2016-01-22 80 views
3

我想不通的区别:XPath中// * /和/ * //之间的区别?

/RootNode//*/@* (1) 

/RootNode/*//@* (2) 

可能(1)说:“从RootNode开始深入,你可以直到你找到任何属性的所有叶子打印和然后打印它“并且 (2)说”从RootNode开始,取所有元素(只有RootNode的孩子),然后尽可能地深入,直到找到具有要打印的属性的叶子为止“。我错了吗? (1)(2)之间的区别是什么?

+0

是什么让你觉得有区别?例如,你有什么能与一个而不是另一个协同工作? – AakashM

+0

在我看来没有。他们应该显示相同的结果。但是我写了'(1)'的解决方案,我的教授在上面写了一个大红色的“X”,并写了'(2)'。我不懂为什么。如果它们相同,那么如果一个是正确的,另一个也是。 – bogALT

回答

1

它们都是等价的。他们都表示,

Select all of the attributes on elements beneath the top RootNode element.

无论*之前或之后的后代或自身一步不要紧出现。

+0

感谢您的编辑,但我认为'/ RootNode/* // data/@ *'应该保留'/ RootNode/* // data(@ *)',因为'data'不是路径的一部分,而是一个打印的函数属性值。对? – bogALT

+0

我被要求显示文档中的所有属性,如果我输入'/ RootNode/* // data(@ *)'它可以工作,如果我尝试'/ RootNode/* // @ *'则不能。错误:*没有systemId *的模块的第1行错误: XPTY0004:无法创建父级为文档节点的属性节点(名称) 无法创建父级为文档节点的属性节点(名称) – bogALT

+0

' // @ *'将选择文档中的所有属性值;你不需要'data()',但是如果这不是你的意图,我会删除'data'作为一个元素。 – kjhughes