Как получить элемент TOP N, соответствующий условию с XPath - PullRequest
2 голосов
/ 05 мая 2011

У меня есть такой XML-код

<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>

Я бы хотел с одним xpath (я в контексте ac # не являюсь шаблоном xslt) получить 2 первых элемента со значением 4, т. Е.

<el id="3" value="4"/>
<el id="4" value="4"/>

с /root/el[position() <= 2 and @value=4] Я бы получил 0 элемент, потому что position () основан на родительском узле, а не на текущем подмножестве.

Я могу сделать это в c #, но это кажется бесполезнымзагрузить 1200 узлов, когда мне нужно только 20.

Спасибо

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Следующее работает для меня в сценарии XSLT;

  <xsl:template match="/">
    <xsl:apply-templates select="/root/el[@value=4][position()&lt;=2]" />
  </xsl:template>

Результатом являются идентификаторы 3 и 4, поэтому XPATH /root/el[@value=4][position()&lt;=2] должен работать для вас.

2 голосов
/ 05 мая 2011

Ответ @rsp правильный, но я бы хотел добавить объяснение. Не всегда верно, что [cond1 and cond2] эквивалентно [cond1][cond2]. Вам нужна вторая форма.

Ваше выражение:

/root/el[position() <= 2 and @value=4]

... выбирает все элементы el, которые имеют атрибут value, равный 4, и положение которого меньше или равно 2. В вашем документе нет таких элементов.

Вы хотите:

/root/el[@value=4][position() <= 2]

... который сначала выбирает все элементы el с атрибутом value, равным 4 , а затем фильтрует этот список по позиции, как требуется.

...