Выберите элементы с уникальными значениями

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

IE, я хотел бы получить из следующего фрагмента 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?


person Aru    schedule 01.07.2011    source источник
comment
XPath — это просто выражение для получения определенного Elemente|Attribute|Node вашего дома. Что вы хотели бы, так это преобразовать ваш первоначальный файл XML в другой. Вы делаете это с помощью XSLT, а затем с помощью выражения XPath с помощью XSLT.   -  person Spredzy    schedule 01.07.2011
comment
Я хотел получить Nodes, но мне не приходило в голову, что я тоже могу получить XML. Спасибо.   -  person Aru    schedule 01.07.2011


Ответы (2)


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

person Kirill Polishchuk    schedule 01.07.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]
 )]
person Emiliano Poggi    schedule 01.07.2011
comment
Я не понимаю ваше выражение XPath, но это создает для меня дополнительный пустой узел. Спасибо за код и пояснение. - person Aru; 01.07.2011
comment
Ответ @polishchuk гораздо безопаснее, потому что это абсолютный XPath, возможно, немного многословный. Я дал вам короткий (идеально работающий над вводом вашего вопроса), который должен быть настроен в соответствии с вашими знаниями о входном xml (и XPath :)). Просто для корректности я отредактировал вопрос, указав более безопасный XPath, который должен быть менее общим, но более безопасным. - person Emiliano Poggi; 01.07.2011