这是一个针对你的大师的XPath / OOXML问题。
我有一个MSOffice docx,其中突出显示了不同颜色的文本,我必须转换为XML,然后使用XPath识别所有这些突出显示,无论颜色如何,以便可以在XML规则中过滤它们。 / p>
以下是MSWord中的示例
我理解如何选择子节点如果存在使用// w:p / w:r / w:rPr / w:突出显示[@w:val ='黄色']&# 34;
但如果高亮节点存在于同一W:t
块中,我不能如何选择包含文本的实际<w:r>
节点。
示例:如果父节点中存在<W:t>
,我需要在<w:highlight>
中选择文本,并对文档中的所有情况执行此操作。
所以在这个例子中我需要选择文本&#34;这个是因为它突出显示黄色&#34;因为它有一个w:highlight节点,其w:val与黄色相关。
<w:r w:rsidRPr="003815B4">
<w:rPr>
<w:highlight w:val="yellow"/>
</w:rPr>
<w:t>This one goes because it is highlighted yellow</w:t>
</w:r>
任何帮助或指示将不胜感激: - )
这是docx的xml示例(为了便于阅读,删除了OOXML标头)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doc>
<w:body>
<w:p w:rsidR="00B93038" w:rsidRDefault="003815B4">
<w:r>
<w:t>This line stays because it is not highlighted in any colour</w:t>
</w:r>
</w:p>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r w:rsidRPr="003815B4">
<w:rPr>
<w:highlight w:val="yellow"/>
</w:rPr>
<w:t>This one goes because it is highlighted yellow</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4621"/>
<w:gridCol w:w="4621"/>
</w:tblGrid>
<w:tr w:rsidR="003815B4" w:rsidTr="003815B4">
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t>And so on</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r w:rsidRPr="003815B4">
<w:rPr>
<w:highlight w:val="cyan"/>
</w:rPr>
<w:t>Blue highlight</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr w:rsidR="003815B4" w:rsidTr="003815B4">
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t>Red</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t xml:space="preserve">Mixed </w:t>
</w:r>
<w:r w:rsidRPr="003815B4">
<w:rPr>
<w:highlight w:val="red"/>
</w:rPr>
<w:t>text</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve"> with </w:t>
</w:r>
<w:r w:rsidRPr="003815B4">
<w:rPr>
<w:highlight w:val="green"/>
</w:rPr>
<w:t>some highlighted</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve"> and some not</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr w:rsidR="003815B4" w:rsidTr="003815B4">
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4621" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/>
</w:tc>
</w:tr>
</w:tbl>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t>Another highlight</w:t>
</w:r>
</w:p>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t>Some text</w:t>
</w:r>
</w:p>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4"/>
<w:p w:rsidR="003815B4" w:rsidRDefault="003815B4">
<w:r>
<w:t>End</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
</w:p>
<w:sectPr w:rsidR="003815B4">
<w:pgSz w:w="11906" w:h="16838"/>
<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
<w:cols w:space="708"/>
<w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:body>
</doc>
答案 0 :(得分:1)
我想这应该有效。 使用命名空间初始化变量:
w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
由于您还没有提到您正在使用的语言,因此我只需在下面指定xpath语法: 此代码只提取带有一般突出显示的文本。
'.//w:p/w:r/w:highlight/../..//w:t', namespaces = {'w':w}
要指定值黄色,请使用:
'.//w:p/w:r/w:highlight[@w:val="yellow"]/../..//w:t', namespaces = {'w':w}
请注意&#34; w&#34;区分大小写,不要使用大写字母。
对于'../..//'
,如果你检查xml,则highlight属性位于低于w:r
一级的rPr标记下。因此../
选择父(即w:rPr),然后选择另一个../
来选择祖父母(即w:r),然后另一个/
选择w:r
下的文本}。