XPath 表达式有条件地获取相邻节点
Posted
技术标签:
【中文标题】XPath 表达式有条件地获取相邻节点【英文标题】:XPath Expression to get adjacent nodes conditionally 【发布时间】:2018-06-15 16:44:48 【问题描述】:我有一个包含如下内容的 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>
。
现在我想要得到的是在<fldChar fldCharType="begin"/>
和<fldChar fldCharType="end"/>
之间的t
节点内的文本,如果在这两个标签之间有一个instrText
,其文本包含'_Ref'
即instrText[contains(text(), '_Ref']
。
基于此,从示例 xml 中,我希望只返回:<t>This is all the text I want to capture</t>
。
这可以用一个 XPath 1.0 表达式来完成吗?
【问题讨论】:
【参考方案1】:试试这个:p/r[preceding-sibling::r[fldChar/@fldCharType='begin'] and following-sibling::r[fldChar/@fldCharType='end']]/t[contains(., '_Ref')]
【讨论】:
这目前不起作用,但我可以看到它的发展方向......我将继续尝试它。谢谢指点。 这仍然有问题...But not this
仍然返回,因为前面的兄弟姐妹检查了所有前面的兄弟姐妹...
为什么不显示But not this
?您可以在原始帖子中添加预期的输出吗?【参考方案2】:
这就是我最终使用的://p/r[preceding-sibling::r[fldChar/@fldCharType='begin'] and following-sibling::r[fldChar/@fldCharType='end']][instrText[contains(text(), '_Ref')]]/following-sibling::r[t][1]
【讨论】:
以上是关于XPath 表达式有条件地获取相邻节点的主要内容,如果未能解决你的问题,请参考以下文章