如何使用XPath轴编写名称空间无关的XPath查询

时间:2015-07-02 00:50:16

标签: xml xpath

假设我有以下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>

2 个答案:

答案 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']]