在XPath表示法中,表达式* * [self :: SOME_LABEL]与// SOME_LABEL有何不同?

时间:2012-06-06 15:43:31

标签: xml xslt xpath transformation

在工作中,我正在更新一些XSLT转换代码,并且在某些地方,以前的程序员使用前一个表达式从XML文档中检索名为SOME_LABEL的元素的值。

// * [self :: SOME_LABEL]和// SOME_LABEL表单似乎都产生相同的结果节点集。

原来的程序员不再在这里工作了,但在我的研究中,我找不到任何理由,前者比后者更好。我当然不想破坏工作代码,但第二种形式更具可读性和自我记录性(可维护性)。

我倾向于使用它来完成我正在编写的新代码中的相同结果,并希望使所有这些表达式保持一致;如果不这样做,就会使代码成为两者的奇怪混合。

有什么理由我不应该将第一个表格的所有出现都改为第二个?

2 个答案:

答案 0 :(得分:2)

  

在XPath表示法中,表达式//*[self::SOME_LABEL]//SOME_LABEL的区别如何?

可读性不同。否则它是等价的。

在XPath 1.0中使用self轴的一个原因是,您希望在给定路径位置选择一组不同的元素节点,这些节点很难输入并且您不想重复:

/some/longish[@and='complicated']/path/then[ self::a or self::b or self::c ]

在您的示例中不是这种情况。因此,您可以进行更改以简化维护。

答案 1 :(得分:1)

默认轴是child ::,因此它的含义不同。下图是Crane Softwrights。

Valid XHTML

然而,// * [self :: X]确实与// X匹配相同的节点。所以是的,做这个替换。