我有一个XML文件,内容如下:

<p>
    <r>
        <t xml:space="preserve">Reading is easier, </t>
    </r>
    <r>
        <fldChar fldCharType="begin"/>
    </r>
    <r>
        <instrText xml:space="preserve"> REF _Ref516568558 \r \p \h </instrText>
    </r>
    <r>
        <fldChar fldCharType="separate"/>
    </r>
    <r>
        <t>This is all the text I want to capture</t>
    </r>
    <r>
        <fldChar fldCharType="end"/>
    </r>
    <r>
        <t xml:space="preserve">, in the new Reading view </t>
    </r>
    <r>
        <fldChar fldCharType="begin"/>
    </r>
    <r>
        <instrText xml:space="preserve"> REF _Not516755367 \r \h </instrText>
    </r>
    <r>
        <fldChar fldCharType="separate"/>
    </r>
    <r>
        <t>But not this...</t>
    </r>
    <r>
        <fldChar fldCharType="end"/>
    </r>
    <r>
        <t xml:space="preserve"> Some other text... </t>
    </r>
</p>


我知道我可以使用XPath表达式//instrText[contains(text(), '_Ref')]来获取<instrText xml:space="preserve"> REF _Ref516568558 \r \p \h </instrText>

现在,我要获取的是t<fldChar fldCharType="begin"/>之间的<fldChar fldCharType="end"/>节点内的文本,如果这两个标签之间存在一个instrText且其文本包含'_Ref'instrText[contains(text(), '_Ref']

基于此,从示例xml中,我希望仅返回:<t>This is all the text I want to capture</t>

可以使用单个XPath 1.0表达式完成此操作吗?

最佳答案

试试这个:p/r[preceding-sibling::r[fldChar/@fldCharType='begin'] and following-sibling::r[fldChar/@fldCharType='end']]/t[contains(., '_Ref')]

07-26 06:32