xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

position() и last()


Автор Сообщение
Teo_home
Новичок

Зарегистрирован: 27.05.2002
Сообщения: 11
Откуда: Москва, Строгино
Посетить сайт автора
[2541] Сб Дек 21, 2002 00:00
position() и last()
test.xml:

Код:

<?xml version="1.0"?>
<root><item>item1<item>item2<item>item3</item></item></item></root>



test.xsl:

Код:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/root"><root><xsl:apply-templates select="//item[last()]/ancestor-or-self::item"/></root></xsl:template>

<xsl:template match="item"><a><xsl:value-of select="text()"/></a></xsl:template>

<xsl:template match="item[position()=last()]"><b><xsl:value-of select="text()"/></b></xsl:template>
</xsl:stylesheet>



Результат получается удручающий, не хочет работать правильно match="item[position()=last()]" ???
При этом, если вывожу значение position() и last(), то все правильно.

p.s. использую msxml4
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2542] Вс Дек 22, 2002 00:00
Re: position() и last()
каким именно должен быть результат?

Тео, под понятием "position()=last()" уж не разумеешь ли ты
"самый внутренний элемент item своей структуры"? - то было бы нехорошо.
Teo_home
Новичок

Зарегистрирован: 27.05.2002
Сообщения: 11
Откуда: Москва, Строгино
Посетить сайт автора
[2543] Пн Дек 23, 2002 00:00
Re: position() и last()
Почему это не хорошо?
last() будет последний в оси элемент
если я в примере вывожу значения position() и last(), то все правильно 1,3 - 2,3 - 3,3
Сколько раз уже натыкался на несовместимость фильтрации в XPath и значению функций, совершенно разное направление оси при фильтре и порядке обработки элементов.
Как в моем примере отдельно обработать самый внутренний элемент?

P.S.После написания сообщения нашел способ, но не такой хороший как пример выше, который к сожалению не работает.
<xsl:template match="item[not(item)]">
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2544] Вт Дек 24, 2002 00:00
Re: position() и last()

Цитата:

> Сколько раз уже натыкался на несовместимость фильтрации в XPath и значению функций, совершенно разное направление оси при фильтре и порядке обработки элементов.


Teo, тяжело в учении, легко в бою (A.Суворов), а XSLT (и XPath как подможество) - тяжелый Wink  но замечательно продуманный и непротиворечивый язык (с)Taler).

Цитата:

> Почему это не хорошо? last() будет последний в оси элемент..


Интересно, по какой-такой оси?

1. "Самый внутренний элемент" - xm.. возможно, вы имели в виду нечто по осям семейства "descendant", но уж никак не по оси child. Другими словами, в "наиболее привычных формах" position() и last() меряют вам контекст "среди фиксированного уровня дерева" (т.е. чаще всего, а также по умолчанию, среди "моих равнолюбимых детей"). Разумеется, осями для position() и last() тоже никто не запретил варьировать, но только тогда вы обязаны строго понимать "все последствия", что будет происходить, все ограничения и логику отсчетов position() и last().

2. а патерны в match - спец. тип Xpath-выражений, имеющий тучу ограничений, к примеру (не трогая предикатов) в них допустимы только две оси: умалчиваемая ось child и ось атрибутов @ - все. Под фразой "это не есть хорошо" я и разумею невдумчивое, вольное и небезопасное обращение с position() и last() - особенно в патернах match шаблонов!

3. Ближе к задаче "Как в моем примере отдельно обработать самый внутренний элемент?" вы совершенно правильно нашли нужную формулу:

Код:

<xsl:template match="item[not(item)]">


интересно, почему это плохо, если это "правильно"? Ну, если очень хочется сократить или не иметь в предикате явных указаний на item, можно писать еще иногда:

Код:

<xsl:template match="item[not(*)]">

Teo_home
Новичок

Зарегистрирован: 27.05.2002
Сообщения: 11
Откуда: Москва, Строгино
Посетить сайт автора
[2545] Вт Дек 24, 2002 00:00
Re: position() и last()
спасибо за подробный ответ
работаю с xslt уже давно, а принцип работы xpath в match только сейчас понял, просто раньше была в основном плоская структура, и таких ситуаций не наблюдалось, обрабатываемая ось совпадала со структурой данных (child::*)
а было бы неплохо использовать расширенный синтаксис xpath, и определять с чем работаешь, с документом, или с текущей осью, для этого подошла бы функция xslt current(), но она не работает в шаблонах Smile