XSLT: 如何在XPath中去掉默认命名空间的前缀?(xmlns="...")

3

我有一个模板:

<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>

为什么尽管我设置了默认命名空间,但这个方法仍然无法使用?
1个回答

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

Why this doesn't work despite I have a default namespace set?

这是任何XSLT和/或XPath列表中最常见的问题之一

XPath将任何未带前缀的名称视为属于“无命名空间”,而不管是否定义了并处于范围内的默认命名空间。

引用W3C XPath 1.0规范

"在节点测试中的QName将使用表达式上下文中的命名空间声明扩展为扩展名称。这与在开始和结束标记中扩展元素类型名称的方式相同,只是不使用xmlns声明的默认命名空间:如果QName没有前缀,则命名空间URI为null"

因此,上面的模板规则匹配的是处于“无命名空间”的元素,但XML文档的元素位于“urn:jboss:domain:1.1”命名空间中,因此以上规则不匹配任何节点。


谢谢。在提问之前,我已经阅读了规范,但解释看起来非常不合逻辑,以至于我以为自己没有理解。现在我明白了。 - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接