OOXML中的XPath

时间:2014-12-02 18:00:48

标签: xml xpath openxml

这是一个针对你的大师的XPath / OOXML问题。

我有一个MSOffice docx,其中突出显示了不同颜色的文本,我必须转换为XML,然后使用XPath识别所有这些突出显示,无论颜色如何,以便可以在XML规则中过滤它们。 / p>

以下是MSWord中的示例

enter image description here

我理解如何选择子节点如果存在使用// w:p / w:r / w:rPr / w:突出显示[@w:val =&#39;黄色&#39;]&# 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>

1 个答案:

答案 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下的文本}。