Выбор конкретных и уникальных атрибутов с XPATH - PullRequest
1 голос
/ 25 августа 2011

Я пытаюсь выполнить запрос XPATH, который позволит мне выбирать узлы на основе двух критериев.

Сначала мне нужны узлы, которые содержат уникальное значение атрибута, а затем мне нужноузлы, которые содержат специфическое значение атрибута.

Например:

<rows>
    <row value="0" id="130"/>
    <row value="1" id="130"/>
    <row value="2" id="130"/>
    <row value="0" id="131"/>
    <row value="1" id="131"/>
    <row value="1" id="131"/>
    <row value="2" id="131"/>
    <row value="0" id="132"/>
    <row value="1" id="132"/>
    <row value="2" id="132"/>
</rows>

В этом сценарии я бы хотел, чтобы все узлы содержали уникальные «значения», но только еслиу них также есть id = "131".Я также хотел бы удалить второй узел value = '1'.Я ожидал бы такой результат:

<row value="0" id="131"/>
<row value="1" id="131"/>
<row value="2" id="131"/>

Возможно ли это с одним запросом XPATH?

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Да, но это не красиво. Возможно, есть лучший путь, но здесь он идет:

/rows/row[@id='131'][(not(preceding-sibling::row[@id='131']) or not(following-sibling::row[@id='131'])) or 
                       preceding-sibling::row[@id='131']/@value != @value and 
                       following-sibling::row[@id='131']/@value != @value]

Вот пример, использующий это в немного более сложной версии вашего входного XML. (Я добавил еще <row value="1" id="131"/>, чтобы показать, что он возвращает только уникальные результаты.)

Входной XML:

<rows>
  <row value="0" id="130"/>
  <row value="0" id="131"/>
  <row value="0" id="132"/>
  <row value="1" id="130"/>
  <row value="1" id="131"/>
  <row value="1" id="132"/>
  <row value="2" id="130"/>
  <row value="2" id="131"/>
  <row value="2" id="132"/>
  <row value="1" id="131"/>
</rows>

Результаты:

<row value="0" id="131"/>
<row value="1" id="131"/>
<row value="2" id="131"/>
0 голосов
/ 26 августа 2011

Конечно, вы можете использовать элемент и функцию key (). Создайте ключ, который является комбинацией атрибутов @value и @id элемента , и выберите только те «наборы ключей», которые содержат один узел и чей атрибут @id равен «131» (или как угодно).

<xsl:key name="id-key" match="row" use="concat(@value, '-', @id)" />

<xsl:template
    match="row[count(key('id-key', concat(@value, '-', @id))) = 1 and @id='131']">
    <xsl:copy-of select="." />
</xsl:template>

Весело, не правда ли?

Подробнее об этом здесь: http://www.jenitennison.com/xslt/grouping/muenchian.html

РЕДАКТИРОВАТЬ: Извините, я только что понял, что вам нужен запрос XPATH. Примечание для себя: читайте вопросы более внимательно. Однако ответ все еще может быть полезен, поэтому я оставлю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...