【问题标题】:How can I write a namespace agnostic XPath query using XPath axes如何使用 XPath 轴编写与命名空间无关的 XPath 查询
【发布时间】:2015-07-02 00:50:16
【问题描述】:

假设我有下面显示的 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>

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    您可以使用 XPath local-name() 函数来匹配元素的本地名称,忽略命名空间:

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

    【讨论】:

      【解决方案2】:

      为了完整起见,您可以在 XPath 2.0 中编写

      //Class[descendant::*:Stereotype[@name='AFV']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多