2012-02-16 105 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

相關問題