【问题标题】:XSLT : getting the prefix of an element?XSLT:获取元素的前缀?
【发布时间】: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 提供前缀。

标签: xml xslt function prefix


【解决方案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您的回答添加解释并说明适用的限制和假设。
        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多