2013-01-17 55 views
1

任何人都可以向我解釋爲什麼下面的XSLT:當存在屬性數據時,爲什麼xpath不會拾取節點?

<xsl:if test="EventDocument"> 

不拾此XML標記?

<EventDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.itron.com/ItronInternalXsd/1.0/"> 

當我刪除的標籤,這是沒有意義的我的屬性它的工作原理。

I.E.上述測試通過時,我修改輸入爲:

<EventDocument> 

我使用XSLT 2.0(撒克遜解析器)預先感謝

回答

2
xmlns

是「保留的屬性」 - 它是命名空間的映射的定義前綴到完整節點名稱空間。詳細內容如下:What does "xmlns" in XML mean?

即:您的案例中節點的實際名稱是"http://www.itron.com/ItronInternalXsd/1.0/" EventDocument,但您嘗試選擇"" EventDocument(名稱爲「EventDocument」且空名稱空間的節點)。

根據您的XPath引擎,你需要你的空間前綴的任何

  • 通映射到命名空間
  • 使用顯式匹配命名空間和節點名稱。 *[namespace-uri()="http://www.itron.com/ItronInternalXsd/1.0/" and local-name()=="EventDocument"]
  • 作弊,只是比賽的節點名稱*[local-name()=="EventDocument"]

local-namenamespace-uri覆蓋http://www.w3.org/TR/xpath/#section-Node-Set-Functions)。

+1

難道不應該是'本地名稱()'? – JLRishe

+0

@JLRishe,你是絕對正確的 - 應該是'地方name',不'節點name'。 –

2

默認情況下,在XPath表達式前綴的元素名稱來指代元件與沒有命名空間,從而表達EventDocument選擇與本地名稱「EventDocument」和沒有命名空間的元素。該

<EventDocument ... xmlns="http://www.itron.com/ItronInternalXsd/1.0/"> 

元素不匹配此模式,因爲它是在http://www.itron.com/ItronInternalXsd/1.0/命名空間。

你有兩個選擇,要麼

  1. 綁定該命名空間在樣式表前綴,然後使用XPath表達式的前綴,或
  2. (因爲你說你是在XSLT 2 。0)使用xpath-default-namespace

例1的

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:itron="http://www.itron.com/ItronInternalXsd/1.0/" 
     version="2.0"> 

    <xsl:template match="itron:example"> 
    <xsl:if test="itron:EventDocument">....</xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

例2

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xpath-default-namespace="http://www.itron.com/ItronInternalXsd/1.0/" 
     version="2.0"> 

    <xsl:template match="example"> 
    <xsl:if test="EventDocument">....</xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

我個人的偏好是選項1,在此基礎上 「的最小驚訝原則」 的人誰必須在將來維護樣式表(包括原始作者,在幾個月後回到代碼...)。

相關問題