在XSLT 1.0中,您可以使用以下函数获取XML元素的本地名称或namespaceUri:
string local-name (node)
和
string namespace-uri(node)
但是有一个标准的函数来获取具有限定名称的元素的前缀吗?
答案 0 :(得分:9)
据我所知。如果您确定节点名称有前缀,则可以使用:
substring-before(name(), ':')
或者,如果您不确定:
substring-before(
name(),
concat(':', local-name())
)
后一个表达式基于以下事实:substring-before()
在找不到搜索到的字符串时返回空字符串。通过这种方式,它可以正确地用于前缀和无前缀名称。
答案 1 :(得分:2)
一般来说,如果你关心元素的前缀,那你就错了。你应该只关心它所属的命名空间。
在您的评论中,您注意到您正在与之交谈的API要求您提供命名空间和命名空间前缀。这是真的,但是您链接到的API实际上并不关心命名空间前缀是什么 - 事实上,如果您不提供名称空间前缀,它将随机生成名称空间前缀。
如果您正在生成整个XML文档,那么如果您将前缀与命名空间URI进行一对一映射,那就太好了。它使输出更容易理解。但这些前缀是什么并不重要。
答案 2 :(得分:1)
对于进一步的细微差别,我建议阅读"Perils of the name() function"。
例如,只有在XPath 2.0中才能可靠地获取元素的前缀。在XPath 1.0中,元素使用的前缀不是数据模型的一部分。
给出以下XML:
<my:foo xmlns:my="http://example.com" xmlns:my2="http://example.com"/>
XPath 1.0中的name()函数可以合法地返回“my:foo”或“my2:foo”。但是在XPath 2.0中,必须返回“my:foo”。
答案 3 :(得分:-1)