Получить уникальный набор результатов, используя абсолютный путь узлов (или аналогичный) в качестве ключа - PullRequest
1 голос
/ 14 декабря 2011

У меня есть XML, который выглядит следующим образом.

<CONTAINER>
    <SEARCHFOR />
    <ITEM/>
    <ITEM/>
    <ITEM/>
    <ITEM/>
    <ITEM/>
    <CONTAINER>
        <SEARCHFOR />
        <ITEM/>
        <ITEM/>
        <CONTAINER>
            <SEARCHFOR />
            <ITEM id="1" />
            <ITEM/>
            <ITEM/>
            <CONTAINER>
                <ITEM id="2" />
            </CONTAINER>
        </CONTAINER>
    </CONTAINER>
</CONTAINER>

Я ищу узлы SEARCHFOR, наиболее близкие по объему к узлам ITEM.Смотрите мой другой вопрос, что я имею в виду здесь.

Найти ближайшего предка / родного брата, который соответствует критериям

Мне нужно сначала найти интересующие узлы ITEM, а затем перейти оттам для узлов поиска.Другими словами, // SEARCHFOR как мое выражение недостаточно.У меня есть выражение, которое находит узел SEARCHFOR, ближайший по объему к каждому узлу ITEM.Это хорошо работает и выглядит как ...

for $v in 
    //ITEM       
return 
    ($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()]

Однако список результатов не уникален.Я получаю 11 результатов, по одному для каждого узла ITEM, как и ожидалось.Мне нужен уникальный набор результатов, содержащий только 3 элемента.Я видел предложения по использованию группировки в XSL, но я не могу сделать это с помощью инструментов, которые я использую, но я могу использовать синтаксис XPath 2.0.Я также видел использование normalize-space () для получения уникальных результатов, но у меня нет текста с моим XML.Моя уникальность должна определяться абсолютным путем каждого узла.

Спасибо за любую помощь, Майкл

1 Ответ

1 голос
/ 14 декабря 2011

Хорошо выберите только те элементы ITEM, которые вас интересуют (т.е. те, которые имеют SEARCHFOR): ITEM[ (ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()] ]/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR)[last()] Или просто добавьте шаг /. к тому, что у вас есть, например. (for $v in //ITEM<br> return ($v/(ancestor::CONTAINER/SEARCHFOR|preceding-sibling::SEARCHFOR))[last()])/., что должно устранить любые дубликаты.

...