【问题标题】:XSLT: How get rid of default namespace's prefixes in XPath? (xmlns="...")XSLT:如何摆脱 XPath 中默认命名空间的前缀? (xmlns="...")
【发布时间】:2012-02-16 02:18:01
【问题描述】:

我有一个模板:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="urn:jboss:domain:1.1"
    xmlns:d="urn:jboss:domain:1.1"
            >

...

<xsl:template match="//d:interfaces/d:interface[@name='management']/d:inet-address">
    ...
</xsl:template>

这行得通。

<xsl:template match="//interfaces/interface[@name='management']/inet-address">
    ...
</xsl:template>

尽管我设置了默认命名空间,为什么这不起作用?

【问题讨论】:

    标签: xslt xpath namespaces xml-namespaces


    【解决方案1】:
    <xsl:template match="//interfaces/interface[@name='management']/inet-address">
         ... 
    </xsl:template> 
    

    尽管我设置了默认命名空间,为什么这不起作用?

    这是所有 XSLT 和/或 XPath 列表中最常见的常见问题解答之一

    XPath 将任何不带前缀的名称视为属于“无命名空间”——无论是否定义了默认命名空间并在其范围内。

    引用W3C XPath 1.0 specification

    "节点测试中的 QName 使用 来自表达式上下文的命名空间声明。这是一样的 对开始和结束标签中的元素类型名称进行扩展的方式 除了不使用用 xmlns 声明的默认命名空间:如果 QName 没有前缀,则命名空间 URI 为空"

    因此,上面的模板规则是匹配“无命名空间”中的元素,但 XML 文档的元素在 "urn:jboss:domain:1.1" 命名空间中——因此没有一个节点与上述规则匹配。

    【讨论】:

    • 谢谢。在询问之前我已经阅读了规范,但解释似乎非常不合逻辑,以至于我认为我不明白它。现在我明白了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多