XSLT:获取元素的前缀?

Posted

技术标签:

【中文标题】XSLT:获取元素的前缀?【英文标题】:XSLT : getting the prefix of an element? 【发布时间】:2010-01-11 13:08:54 【问题描述】:

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

string local-name (node)

string namespace-uri(node)

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

【问题讨论】:

我很好奇你为什么想要这个前缀?归根结底,xslt 引擎并没有真正“理解”前缀,而是命名空间,例如,输出文档可能对同一个命名空间使用不同的前缀? (也可能有不同的前缀应用于同一个命名空间......) @Yossi 我想从 XML 文件为 StaX Parser (java.sun.com/javase/6/docs/api/javax/xml/stream/…) 生成一个 Java 存根。此 API 需要声明命名空间并为 qNames 提供前缀。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

关于更多细微差别,我建议阅读"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”。

【讨论】:

【参考方案4】:

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。

以上是关于XSLT:获取元素的前缀?的主要内容,如果未能解决你的问题,请参考以下文章

删除 XSLT 映射生成的元素的名称空间前缀

XSLT 获取最后一个元素

如何将前缀类型添加到重复父节点并使用 XSLT 选择每个元素的所有元素?

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀

如何在 XSLT 中使用 XPath 获取元素数组,包括缺失的元素?

在 XSLT 中匹配具有名称空间前缀的元素