name()condition和self :: axis之间有什么区别

时间:2013-10-02 15:44:40

标签: xpath

输入xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <a>1</a>
    <b>2</b>
    <b>3</b>
    <c>4</c>
</root>

我想知道跟随xpath

之间是否有任何区别
//b

//*[name() = 'b']

//*[self::b]     (or //self::b)

这些表达式似乎返回相同的结果,但它是否每次都是真的?我倾向于自由地交换它们但有这样的感觉我不应该。

1 个答案:

答案 0 :(得分:1)

一个区别是name()函数使用对传入节点有效的命名空间声明(通常来自XML源),而其他方法使用表达式上下文中的命名空间声明。这意味着如果不同的输入文档使用不同的名称空间前缀,name()函数可能会导致不可预测的结果。

另一个区别是name()函数也适用于元素以外的节点。但是对于没有命名空间的元素,可以互换使用所有方法。