假设我有以下XML:
<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”元素的所有“Class”元素?
如果没有任何名称空间,我会使用所谓的Xpath Axes,我的查询看起来像这样:
//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>
答案 0 :(得分:1)
您可以使用XPath local-name()
函数来匹配元素的本地名称,忽略名称空间:
//*[local-name()='Class'][descendant::*[local-name()='Stereotype' and @name='AFV']]
答案 1 :(得分:1)
为了完整起见,在XPath 2.0中你可以编写
//Class[descendant::*:Stereotype[@name='AFV']]