4

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

string local-name (node)

string namespace-uri(node)

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

4

4 回答 4

9

据我所知不是。如果您确定节点名称有前缀,则可以使用:

substring-before(name(), ':')

或者这个,如果你不确定:

substring-before(
  name(), 
  concat(':', local-name())
)

substring-before()后一个表达式基于在未找到搜索字符串时返回空字符串的事实。这样,它就可以正确处理带前缀不带前缀的名称。

于 2010-01-11T13:17:12.517 回答
2

一般来说,如果你关心一个元素的前缀,那你就错了。您应该只关心它属于哪个命名空间。

在您的评论中,您注意到您正在与之交谈的 API 要求您提供命名空间和命名空间前缀。确实如此,但是您链接到的 API 实际上并不关心名称空间前缀是什么 - 事实上,如果您不提供名称空间前缀,它会随机生成一个名称空间前缀。

如果您正在生成整个 XML 文档,那么如果您有前缀到命名空间 URI 的一对一映射,那就太好了。它使输出更容易理解。但这些前缀是什么并不重要。

于 2010-01-13T02:00:26.300 回答
1

对于进一步的细微差别,我建议阅读“名称()函数的危险”

例如,只有在 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”。

于 2010-01-12T10:21:40.103 回答
-1

<xsl:value-of select="root()/xs:schema/namespace::node()[.= parent::*/@targetNamespace]/name()"/>

于 2021-02-11T22:23:58.310 回答