Выберите элементы с уникальными значениями - PullRequest
2 голосов
/ 01 июля 2011

Я пытаюсь проанализировать электронную таблицу OpenOffice, чтобы получить строки с уникальными значениями в первом столбце.

I.E. Я бы хотел извлечь из следующего фрагмента XML все <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?

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

Этот 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())]

0 голосов
/ 01 июля 2011

Чистый 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]
 )]
...