2

我正在尝试解析 OpenOffice 电子表格以获取第一列中具有唯一值的行。

IE,我想从以下 XML 片段中检索第一个 child 中<table:table-row>具有唯一值的所有元素。<text:p><table:table-cell>

    <table:table table:name="foo">
        <table:table-row>
            <table:table-cell>
                <text:p>1</text:p>
            </table:table-cell>
            <table:table-cell>
                <text:p>foo</text:p>
            </table:table-cell>
        </table:table-row>
        <table:table-row>
            <table:table-cell>
                <text:p>2</text:p>
            </table:table-cell>
            <table:table-cell>
                <text:p>bar</text:p>
            </table:table-cell>
        </table:table-row>
        <table:table-row>
            <table:table-cell>
                <text:p>1</text:p>
            </table:table-cell>
            <table:table-cell>
                <text:p>baz</text:p>
            </table:table-cell>
        </table:table-row>
    </table:table>

我希望得到以下输出作为节点

        <table:table-row>
            <table:table-cell>
                <text:p>1</text:p>
            </table:table-cell>
            <table:table-cell>
                <text:p>foo</text:p>
            </table:table-cell>
        </table:table-row>
        <table:table-row>
            <table:table-cell>
                <text:p>2</text:p>
            </table:table-cell>
            <table:table-cell>
                <text:p>bar</text:p>
            </table:table-cell>
        </table:table-row>

我怎样才能用 XPath 做到这一点?

4

2 回答 2

0

纯 XPath 应该是:

 /table:table/table:*[not(
  .//text:p[1]
   = preceding-sibling::table:table-row//text:p[1]
 )]

如果具有预期的输出,您的意思是一系列table:row节点而不是 xml 文档,因为有人在评论中正确地注意到了这一点

 /table:table/table:*[not(
  ./table:*[1]//text:*[1]
   = preceding-sibling::table:*/table:*[1]/text:*[1]
 )]
于 2011-07-01T12:01:43.223 回答
0

此 XPath 产生所需的输出: /table:table/table:table-row[not(./table:table-cell[1]/text:p/text() = preceding-sibling::table:table-row/table:table-cell[1]/text:p/text())]

于 2011-07-01T12:29:21.370 回答