XSLT:获取元素的前缀?

时间:2010-01-11 13:08:55

标签: xml xslt function prefix

在XSLT 1.0中,您可以使用以下函数获取XML元素的本地名称或namespaceUri:

string local-name (node)

string namespace-uri(node)

但是有一个标准的函数来获取具有限定名称的元素的前缀吗?

4 个答案:

答案 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)