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
祖先。
我一直在关注以 .//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
祖先。