2015-07-02 45 views
1

假設我有XML介紹如下:如何使用XPath軸我寫一個名字空間無關的XPath查詢

<ns1:test xmlns:ns1="http://www.w3.org/TR/html3/" xmlns:UML="http://www.w3.org/TR/html4/"> 
    <UML:Class name="test1"> 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="AFV"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
    <UML:Class name="test2" > 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="AFV"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
    <UML:Class name="test3" > 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="RCS"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
    <UML:Class name="test4" > 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="DFK"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
    <UML:Class name="test5" > 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="DSO"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
</ns1:test> 

我如何寫一個名字空間無關的XPath查詢將獲得包含所有的「類」元素屬性名稱等於「AFV」的「Stereotype」元素?

如果沒有發現任何的命名空間,我會使用所謂XPath軸,和我的查詢將是這個樣子的: //Class[descendant::Stereotype[@name='AFV']]

XPath查詢應該返回:

<UML:Class name="test1"> 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="AFV"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 
    <UML:Class name="test2" > 
     <UML:ModelElement.stereotype> 
      <UML:Stereotype name="AFV"/> 
     </UML:ModelElement.stereotype> 
    </UML:Class> 

回答

1

您可以使用XPath local-name()函數按元素的本地名稱忽略名稱空間進行匹配:

//*[local-name()='Class'][descendant::*[local-name()='Stereotype' and @name='AFV']] 
1

而對於完整s,在XPath 2.0中你可以編寫

//Class[descendant::*:Stereotype[@name='AFV']] 
相關問題