我有一个模板:
<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>
尽管我设置了默认命名空间,为什么这不起作用?
答案 0 :(得分:4)
<xsl:template match="//interfaces/interface[@name='management']/inet-address"> ... </xsl:template>
尽管我设置了默认命名空间,为什么这不起作用?
这是任何XSLT和/或XPath列表中最常见的常见问题解答之一。
XPath将任何未加前缀的名称视为属于“无名称空间” - 无论是否定义了默认名称空间并且在范围内。
引用W3C XPath 1.0 specification :
“节点测试中的QName使用扩展名扩展为扩展名 表达式上下文中的名称空间声明。这是一样的 对start和end-tags中的元素类型名称进行扩展 除了使用xmlns声明的默认命名空间:if QName没有前缀,那么名称空间URI为空“
因此,上面的模板规则是匹配“无命名空间”的元素,但XML文档的元素位于"urn:jboss:domain:1.1"
命名空间中 - 因此上述规则不匹配单个节点。 / p>