在 XSLT 1.0 中,您可以使用以下函数获取 XML 元素的本地名称或 namespaceUri:
string local-name (node)
和
string namespace-uri(node)
但是是否有标准函数来获取具有限定名称的元素的前缀?
据我所知不是。如果您确定节点名称有前缀,则可以使用:
substring-before(name(), ':')
或者这个,如果你不确定:
substring-before(
name(),
concat(':', local-name())
)
substring-before()
后一个表达式基于在未找到搜索字符串时返回空字符串的事实。这样,它就可以正确处理带前缀和不带前缀的名称。
一般来说,如果你关心一个元素的前缀,那你就错了。您应该只关心它属于哪个命名空间。
在您的评论中,您注意到您正在与之交谈的 API 要求您提供命名空间和命名空间前缀。确实如此,但是您链接到的 API 实际上并不关心名称空间前缀是什么 - 事实上,如果您不提供名称空间前缀,它会随机生成一个名称空间前缀。
如果您正在生成整个 XML 文档,那么如果您有前缀到命名空间 URI 的一对一映射,那就太好了。它使输出更容易理解。但这些前缀是什么并不重要。
对于进一步的细微差别,我建议阅读“名称()函数的危险”。
例如,只有在 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”。
<xsl:value-of select="root()/xs:schema/namespace::node()[.= parent::*/@targetNamespace]/name()"/>