Ниже я создал упрощенный XML-пример того, как выглядит мой xml. У меня есть атрибут, который содержит число, которое я хотел бы посмотреть. Это своего рода счетчик, и при трансформации я хотел бы добавить что-то всякий раз, когда счетчик ++.
Проблема заключается в количестве уровней в моем xml-файле. Здесь я сделал только три, но на самом деле у меня около 8 или, может быть, даже больше. Мне нужно найти способ сравнить текущий узел с предыдущим (или наоборот), но с учетом уровней. Так, например, в приведенном ниже примере узел lvl2 с идентификатором 4 необходимо сравнить с узлом lvl3 с идентификатором 3 просто для того, чтобы узнать, был ли повышен атрибут id.
XML:
<lvl1 id="1">
<lvl2 id="1">
<lvl3 id="1"></lvl3>
<lvl3 id ="2"></lvl3>
</lvl2>
<lvl2 id="2">
<lvl3 id="3"></lvl3>
</lvl2>
<lvl2 id="4"></lvl2>
</lvl1>
Поскольку глобальные переменные-счетчики не могут быть и речи с xslt, у меня в настоящее время нет идей, и я не могу найти их ни здесь, ни где-либо еще.
вывод будет примерно таким:
<ul>
<div>id 1</div>
<li>
<ul>
<li>
<ul>
<li></li>
<div>id 2</div>
<li></li>
</ul>
</li>
<li>
<ul>
<div>id 3</div>
<li></li>
</ul>
</li>
<div>id 4</div>
<li></li>
</ul>
</li>
here the stylesheet which transforms the xml into the html output but without the divs:
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<ul>
<xsl:value-of select="@id"/>
<xsl:apply-templates select="lvl1"/>
</ul>
</xsl:template>
<xsl:template match="lvl1">
<li class="{@id}">
lvl 1
<ul>
<xsl:apply-templates select="lvl2"/>
</ul>
</li>
</xsl:template>
<xsl:template match="lvl2">
<li class="{@id}">lvl 2
<ul>
<xsl:apply-templates select="lvl3"/>
</ul>
</li>
</xsl:template>
<xsl:template match="lvl3">
<li class="{@id}">lvl 3
</li>
</xsl:template>
preceding
, например.(preceding::*/@id)[last()]
. - person LarsH   schedule 14.08.2012count(preceding::*[starts-with(local-name(), 'lvl')])
или даже<xsl:number>
. Трудно понять, если вы не объясните правила, как просил Димитре. - person LarsH   schedule 14.08.2012