#4946From:Kalachihin Vladimir
To:all
Date:01-11-2012 15:03:18
Subj:А XSLT где обсуждают?
Приветствую тебя, all!
Replying to a message of Kalachihin Vladimir to all:

Сам себе не ответишь - так никто не ответит. Измельчало FIDO...

KV> Вот допустим, есть такой XML:

KV> <NNN>
KV> <aaa>
KV> <aaa>
KV> <bbb>
KV> <aaa>
KV> </NNN>

KV> Есть правило преобразования для <aaa>, есть - для <bbb>.

KV> Вопрос - как составить правило для <bbb>, и следующего за ним <aaa>,
KV> так, чтобы выполнилось только это правило, а не правила для <aaa> и
KV> <bbb> в отдельности?

Hатурально, чтобы выполнилось правило для сочетания узлов, а не для каждого вида узлов в отдельности - надо написать такое правило... Hо вот засада - в match в template нельзя использовать JQuery. Почему это так - загадка души разработчиков, ибо нигде не написано, что template должен применяться строго к одному узлу. Hе, это, типа, подразумевается, ну дык не все экстрасенсы...
Поэтому - хоть в match нельзя применять JQuery, но можно в квадратных скобках написать дополнительное ограничение, в котором JQuery применять можно ;-)
Следовательно, для решения задачи надо написать _два правила_: одно для <bbb>, и в [] выразить, что за ним должно следовать <aaa>, и для <aaa>, и в ограничениях указать, что ему должно предшествовать <bbb>

Как-то так:
<xsl:template match="bbb[following-sibling::aaa]">
</xsl:template>
<xsl:template match="aaa[preceding-sibling::bbb]">
</xsl:template>

Hо опять жопа - у нас всё равно два правила, и выполнятся оба - одно для <bbb>, за которым следует <aaa>, а второе - для <aaa>, которому предшествует <bbb>.
Hо здесь уже просто! Мы решим, скажем, что содержательные действия будут выполнятся в первом правиле. Тогда в нём надо в нужном месте обраться к нашему следующему узлу:

<xsl:template match="bbb[following-sibling::aaa]">
<xsl:value-of select=".[following-sibling::aaa]"/>
<xsl:apply-templates/>
</xsl:template>

При этом второе правило нужно оставить пустым. Тогда, если в первом правиле стоит apply-templates (как в примере), узлы <aaa> не будут дублироватся.


В общем, xslt - это, конечно, круто, но не у всех есть такая же трава, как у авторов. Ибо считать соседа после потомком по оси соседей после, а соседа до - потомком по оси соседей до - можно только по большой укурке.



Калачихин Владимир.

--- FleetStreet 1.22+
* Origin: Stager's station, aka stagerATau.ru (2:5095/1.39)
SEEN-BY: 46/50 400/814 450/1024 463/68 4500/5 5000/444 5000 5001/5001 5004/75
SEEN-BY: 5005/49 5010/352 5019/40 5020/400 526 545 715 758 785 830 845 902 982
SEEN-BY: 5020/1042 1982 2123 2140 4441 12000 5021/29 5022/63 128 5025/3
SEEN-BY: 5029/32 5030/115 1339 2404 5033/35 5042/13 5050/9 5051/41 5053/7 54
SEEN-BY: 5053/400 5054/1 5055/37 5059/37 5064/56 5066/18 5068/10 5071/166
SEEN-BY: 5080/68 102 5083/444 5085/13 5094/7 5095/1 20 5099/4 6055/2 6070/109
SEEN-BY: 6078/80 6090/1
PATH: 5095/1 5020/1313 545 4441 1042