gpt4 book ai didi

xml - 具有后代和后代 text() 谓词的 XPath 查询

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:50 26 4
gpt4 key购买 nike

我想构建一个 XPath 查询,它将返回一个“div”或“table”元素,只要它有一个包含文本“abc”的后代。需要注意的是它不能有任何 div 或 table 后代。

<div>
<table>
<form>
<div>
<span>
<p>abcdefg</p>
</span>
</div>
<table>
<span>
<p>123456</p>
</span>
</table>
</form>
</table>
</div>

所以这个查询唯一正确的结果是:

/div/table/form/div 

我最好的尝试是这样的:

//div[contains(//text(), "abc") and not(descendant::div or descendant::table)] | //table[contains(//text(), "abc") and not(descendant::div or descendant::table)]

但没有返回正确的结果。

感谢您的帮助。

最佳答案

有些不同::)

//text()[contains(.,'abc')]/ancestor::*[self::div or self::table][1]

似乎比其他解决方案短很多,不是吗? :)

翻译成简单的英语:对于文档中包含字符串 "abc" 的任何文本节点,选择其第一个祖先,即 divtable

这样效率更高,因为只需要对文档树进行一次完整扫描(不需要任何其他扫描),而且 ancestor::* 遍历非常便宜与 descendent::(树)扫描相比。

验证此解决方案“确实有效”:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
<xsl:copy-of select=
"//text()[contains(.,'abc')]/ancestor::*[self::div or self::table][1] "/>
</xsl:template>
</xsl:stylesheet>

当对提供的 XML 文档执行此转换时:

<div>
<table>
<form>
<div>
<span>
<p>abcdefg</p>
</span>
</div>
<table>
<span>
<p>123456</p>
</span>
</table>
</form>
</table>
</div>

产生了想要的、正确的结果:

<div>
<span>
<p>abcdefg</p>
</span>
</div>

注意:没有必要使用 XSLT——任何 XPath 1.0 宿主——例如 DOM,都必须获得相同的结果。

关于xml - 具有后代和后代 text() 谓词的 XPath 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com