w:p 没有某些祖先元素的 XPath?

XPath for w:p without certain ancestor elements?

我一直在关注以 .//x[not(ancestor::w:tbl)] 形式使用 XPath not ancestor 选择器的示例,但它的行为并不像我预期的那样。

我正在解析一个包含 table 的 Word DOCX 文件。我正在使用 python lxml 库将其解析为 XML。我想获取在其祖先树中的任何位置都没有 table 元素的段落项目。

我在控制台中输入以下内容:

selector = './/w:p[not(ancestor::w:drawing)][not(ancestor::w:tbl)][not(ancestor::v:textbox)][not(ancestor::wps:wsp)][not(ancestor::mc:Fallback)]
nsDict = {k:v for k,v in doc.nsmap.items() if k}
paragraphs = doc.xpath(selector,namespaces=nsDict)
for p in paragraphs:
    print(bool(p.xpath(".//ancestor::w:tbl",namespaces=nsDict)))
>>>>False
>>>>False
>>>>False
>>>>False
>>>>False
>>>>False
>>>>True
>>>>False

预期的行为是段落 xpath 选择器与父文档元素级 xpath 选择器互斥。段落布尔检查应始终为 False.

如何修改我的初始选择器,以便不选取具有 w:tbl 作为祖先的元素?

您的初始 XPath 没问题;是您的测试 XPath 有问题。

您的测试 XPath,

.//ancestor::w:tbl

不是selectw:tbl当前节点的祖先;它 selects w:tbl 个当前节点的任何后代的祖先。

例如,如果一个段落没有 table 的祖先但确实有包含一个段落的后代 table,则将为您的测试产生 True

改为

ancestor::w:tbl

到 select 当前 节点的 w:tbl 祖先。