带命名空间的XPath过滤器属性

时间:2016-01-28 14:01:29

标签: xpath namespaces attributes

我试图让以下工作,但唉它没有返回预期的结果。虽然类似于我在限制为xpath 1.0之前受到限制的问题。

我希望使用xpath来获取“subtitle”节点内的第一个文本节点。 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”并且它具有命名空间。预期结果将是“小标题”。关于如何让它发挥作用的任何想法?

1 个答案:

答案 0 :(得分:0)

XML缺少xml命名空间定义,正如@KeithHall在OP的评论中所指出的那样。

<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]