Я использую xslt 2.0, у меня есть следующий образец xml, я хочу получить все узлы «header-lightgray» между двумя «заголовками-серыми» узлами, проблема здесь: «Не знаю, сколько« заголовок-лайтгейв »есть. поэтому я не могу использовать функцию position(). и xsl для каждого не поддерживают разрыв.Как получить узлы в этом случае
<t>
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
...
<parent class="header-gray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-lightgray"></parent>
<parent class="header-gray"></parent>
</t>
Я хочу пройти через них и заменить все узлы, заголовок-серый с div и header-lightgray с диапазоном. ожидаемый выход:
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
...
</div>
<div class="header-gray">
<span class="header-lightgray"/>
<span class="header-lightgray"/>
<span class="header-lightgray"/>
</div>
Как это сделать?
Любая помощь приветствуется.
Решение Я хотел бы поделиться в соответствии с ответом Яна Vlcinsky в:
<xsl:for-each select="/t/parent[@class='header-gray']">
<xsl:variable name="ns1" select="current()/following-sibling::parent"/>
<xsl:variable name="ns2" select="current()/following-sibling::parent[@class='header-gray'][1]/preceding-sibling::parent"/>
<div class="header-gray">
<xsl:for-each select="$ns1[count(.| $ns2)=count($ns2)]">
<span class="header-lightgray"/>
</xsl:for-each>
</div>
</xsl:for-each>
Я не проверить выше кода, но это та же самая логика в моем реальном коде. Я не использовал xslt 2.0, потому что нашел, что lxml 2.3, который я использую, не поддерживает xslt 2.
Что вы хотите делать с этими элементами после их появления? Какую версию XSLT вы используете? – Borodin
Я хочу пройти через них и заменить все узлы, заголовок-серый с div и header-lightgray с диапазоном. span находится в div. –