name()返回带前缀的完整节点名如ns:book,local-name()仅返回本地名如book;使用local-name()可避免XPath因命名空间前缀不匹配而失效。

在处理带有命名空间的XML文档时,local-name() 和 name() 函数是区分节点名称的关键工具,它们的主要区别在于是否包含命名空间前缀。
name() 函数:返回完整节点名
该函数返回元素完整的、限定的名称(qualified name),这个名称包含了命名空间前缀(如果存在的话)和本地名称。例如,对于一个名为 的元素,name() 函数会返回 ns:book。如果没有定义前缀,则只返回本地名称,如 book。
local-name() 函数:返回不带前缀的本地名
该函数专门用于获取元素的“本地部分”名称,它会完全忽略命名空间前缀。对于上面的例子 ,local-name() 函数只会返回 book。无论元素是否有前缀,它都只关心冒号后面的部分。
为什么这个区别很重要?
当编写XPath表达式来定位元素时,如果XML文档使用了命名空间,直接使用 //ns:book 可能会因为前缀不匹配而失败(比如文档中实际用的是 my:book)。这时,使用 local-name() 可以绕过前缀问题:
- //*[local-name()='book']:这个表达式能匹配所有本地名称为 "book" 的元素,不管它属于哪个命名空间或使用什么前缀。
- 为了更精确,可以结合
namespace-uri()函数:/*[local-name()='Contact' and namespace-uri()='urn:myschema:Contacts'],这确保了元素的本地名和命名空间URI都符合要求。
基本上就这些,核心就是 name() 看全名,local-name() 只看名字本身。









