2016-01-28 91 views
0

我正在嘗試獲取以下工作,但唉,它無法返回預期的結果。雖然與我在限制xpath 1.0之前所問的問題類似。具有名稱空間的XPath過濾器屬性

我正在尋找使用xpath來獲取「副標題」節點內的第一個文本節點。該XML如下:

<topic class="coverPage"> 
    <subtitle id="IDb2907ca1-51fe-472e-bf99-246126937eab"> 
     <xt:delText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T17:07:00" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
      Ignore 
     <xt:delText xt:action="end" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
     Sub-title 
     <xt:insText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T14:55:00" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
      Insert Additional Text 
     <xt:insText xt:action="end" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
     Extra Text 
    </subtitle> 
</topic> 

替代XML還提供如下:

<topic class="coverPage"> 
    Sub-title 
    <subtitle id="IDb2907ca1-51fe-472e-bf99-246126937eab"> 
     <xt:delText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T17:07:00" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
      Ignore 
     <xt:delText xt:action="end" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
     <xt:insText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T14:55:00" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
      Insert Additional Text 
     <xt:insText xt:action="end" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
     Extra Text 
    </subtitle> 
</topic> 

我曾嘗試以下,但沒有運氣:

/topic[@class='coverPage']/*[local-name()='subtitle']/text()[1]|/topic[@class='coverPage']/*[local-name()='subtitle']/*[substring(local-name(), string-length(local-name())-string-length('Text')+1)='Text'][@*[local-name()='action']='end'][1]/following-sibling::text()[1] 

我相信這個問題是屬性值「action」並且它有一個名稱空間。預期的結果將是「小標題」。關於如何讓這個工作的任何想法?

+0

查詢後半彷彿回到「副標題」按照您的期望:http://www.utilities-online.info/xpath/?save=33963c98-b5b0-44b5-b83c- 3010e5d85f12-xpath#.VqomcOaICUk(我從頭開始使用'.',以便它會從根節點開始) –

+0

謝謝@KeithHall,但是您提供的示例包含一個xml命名空間的定義,我的XML不會沒有。我還向OP添加了另一個XML示例,其中包含一個應該與xpath的「OR」部分配合使用的示例。謝謝... – JJDoc

+0

會這樣的幫助嗎? '// topic [@ class =「coverPage」]/descendant :: subtitle/* [position()= 1]' – Newcomer

回答

0

XML缺少xml名稱空間定義,正如OP註釋中由@KeithHall指出的那樣。

<topic class="coverPage" "xmlns:xt="http://stackoverflow.com/questions/35063599/xpath-filter-attribute-with-namespace"> 
    <subtitle id="IDb2907ca1-51fe-472e-bf99-246126937eab"> 
     <xt:delText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T17:07:00" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
      Ignore 
     <xt:delText xt:action="end" xt:id="fb72fba6-f502-422e-9e91-1731ed007e98"/> 
     Sub-title 
     <xt:insText xt:action="start" xt:author="James Doherty" xt:dateTime="2016-01-27T14:55:00" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
      Insert Additional Text 
     <xt:insText xt:action="end" xt:id="44ac82c2-acfc-4721-b962-20ac2b18d9f3"/> 
     Extra Text 
    </subtitle> 
</topic> 

要過濾基於屬性值的XML,命名空間,以下XPath被用於:

[@*[local-name()='action']='end'] 

完整XPath來實現期望的結果是以下,從OP不變。

/topic[@class='coverPage']/*[local-name()='subtitle']/text()[1]|/topic[@class='coverPage']/*[local-name()='subtitle']/*[substring(local-name(), string-length(local-name())-string-length('Text')+1)='Text'][@*[local-name()='action']='end'][1]/following-sibling::text()[1] 
相關問題