Автор |
Сообщение |
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 как подможество) - тяжелый но замечательно продуманный и непротиворечивый язык (с)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(), но она не работает в шаблонах
|