在工作中,我正在更新一些XSLT转换代码,并且在某些地方,以前的程序员使用前一个表达式从XML文档中检索名为SOME_LABEL的元素的值。
// * [self :: SOME_LABEL]和// SOME_LABEL表单似乎都产生相同的结果节点集。
原来的程序员不再在这里工作了,但在我的研究中,我找不到任何理由,前者比后者更好。我当然不想破坏工作代码,但第二种形式更具可读性和自我记录性(可维护性)。
我倾向于使用它来完成我正在编写的新代码中的相同结果,并希望使所有这些表达式保持一致;如果不这样做,就会使代码成为两者的奇怪混合。
有什么理由我不应该将第一个表格的所有出现都改为第二个?
答案 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。
然而,// * [self :: X]确实与// X匹配相同的节点。所以是的,做这个替换。