2012-06-11 90 views
13

我得到了下面的XML:XML元素都有命名空間,我的XPath不工作

<root> 
    <items> 
    <item> 
     <title>Item</title> 
     <details> 
     <data xmlns="http://some_url"> 
      <length>10</length> 
      <weight>1.2</weight> 
     </data> 
     </details> 
    </item> 
    </items> 
</root> 

以下XPath不工作沒什麼意思是印像「數據」元素不存在:

/root/items/item/details/data 

但是,當我刪除「數據」元素的「xmlns」命名空間屬性它的內容被打印。 xpath表達式應該如何在不刪除「data」元素的「xmlns」名稱空間屬性的情況下工作?

我正在使用SAXON和XSL 1.0。

+0

您需要使用XPath e註冊名稱空間ngine,然後使用你在XPath中註冊的別名:'alias:data/alias:length'。如果不知道用於評估XPath的是什麼,我們就無法得到更具體的結果。 –

回答

13

這是一個XPath/XSLT中最常見的問題

XPath將前綴不明的元素名稱解釋爲屬於「no namespace」,這就是僅當屬於默認(非空)名稱空間的名稱前綴未被選中時在XPath表達式中將無前綴的名稱指定爲節點測試。

解決方法是,

  1. 創建一個命名空間的結合,其中前綴(比如"x")與默認的命名空間相關聯,然後指定x:elementName,而不是elementName

  2. 使用長的,醜陋的和不可靠的表現,如:*[name() = 'elementName']

下面是使用上述方法1 XSLT轉換。 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://some_url"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/root/items/item/details/a:data/a:weight"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加(使用撒克遜6.5.4或任何其它符合標準的XSLT 1.0處理):

<root> 
    <items> 
     <item> 
      <title>Item</title> 
      <details> 
       <data xmlns="http://some_url"> 
        <length>10</length> 
        <weight>1.2</weight> 
       </data> 
      </details> 
     </item> 
    </items> 
</root> 

正確/希望節點被選擇並將其字符串值複製到輸出

1.2 
0

在XPath中,您必須爲命名空間分配一個前綴。你如何做到這一點取決於你所使用的,但假設你的命名空間URI http://some_url通過命名空間前綴someUrl關聯的XPath的軟件/庫,你可以改變你的XPath表達式如下:

/root/items/item/details/someUrl:data 
+0

感謝您的回覆。我正在使用SAXON和XSL 1.0。我試圖查詢xpath「/ root/items/item/details/a:data」並打印「data」元素的所有內容。當我查詢「/ root/items/item/details/a:data/a:weight」時,我希望打印出「1.2」,但它再次打印「data」元素的所有內容。你能告訴我做錯了什麼嗎? – Vojtech

+0

當您使用XSL時,您能否顯示完整的XSL樣式表? (或者至少是相當完整的最小化版本?) –