我有一个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')]