вторник, 2 декабря 2008 г.

Могучий, могучий XSLT :-)

Вот уже не первый год активно пишу на XSLT, а до сих пор регулярно обнаруживаю для себя новые возможности. Вот и сегодня, столкнулся с не вполне очевидной проблемой, пусть есть такой документ:
<data>
<item-1>value-1</item-1>
<item-5>value-5></item-5>
<item-3>value-3</item-3>
....
<item-n>value-n</item-n>
</data>
Теперь надо в xslt получать значения этих узлов item-x по номеру (то бишь, по x). На первый взгляд показалось, что без dyn:evaluate из exslt не обойтись, правда такое решение на больших документах (ну там несколько тысяч таких записей), кроме того, ещё и тормозить будет заметно. Этот факт настолько меня растроил, что я тут же придумал решение:
<xsl:key name="item-by-number" match="/data/node()" use="substring(local-name(.), 6)">
и уже в самом коде можно так:
<xsl:value-of select="key('item-by-number', 3)">
Работает... к моему немалому удивлению и восторгу...

2 комментария:

  1. Можно гораздо проще:
    <xsl:value-of select="/data/*[name()=concat('item-', 3)]"/>

    ОтветитьУдалить
  2. Да теперь то мне все подобные варианты уже очевидны, просто раньше не приходилось сталкиваться с запросами, где нужно манипулировать local-name.

    Кроме того, основная фишка здесь именно в использовании xsk:key, что обеспечивает необходимое быстродействие на больших подобных документах.

    ОтветитьУдалить