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 选择每个元素的所有元素?
xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀