2012-02-16 72 views
3

我有一个模板:XSLT:如何摆脱XPath中默认命名空间的前缀? (的xmlns = “...”)

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

为什么这不起作用,尽管我有一个默认的命名空间集?

回答

4
<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"命名空间 - 因此不是一个单一的节点由上述规则相匹配。

+0

谢谢。我在提问之前已经阅读了这个规范,但是这个解释看起来不合逻辑,我以为我不明白。现在我明白了。 – 2012-02-16 04:35:59

+0

@OndraŽižka:不客气。 – 2012-02-16 04:51:10