У меня есть такой XML:
<span>1</span>
<span class="x">2</span>
<span class="x y">3</span>
<span class="x">4</span>
<span>5</span>
<span class="x">6</span>
<span>7</span>
<span class="x">8</span>
Я хочу использовать таблицу стилей XSLT для размещения содержимого всех элементов, чей атрибут class
содержит x
в один элемент
. Таким образом, результат должен быть таким:
1 <x>234</x> 5 <x>6</x> 7 <x>8</x>
(или, в идеале,
1 <x>2<y>3</y>4</x> 5 <x>6</x> 7 <x>8</x>
, но эту проблему нужно решить, когда я ее решу.)
Это соответствующий фрагмент моего XSLT:
<xsl:template match="span[contains(@class,'x') and preceding-sibling::span[1][not(contains(@class,'x'))]]">
<x><xsl:for-each select=". | following-sibling::span[contains(@class,'x')]">
<xsl:value-of select="text()"/>
</xsl:for-each></x>
</xsl:template>
<xsl:template match="span[contains(@class,'x') and preceding-sibling::span[1][contains(@class,'x')]]">
</xsl:template>
<xsl:template match="span">
<xsl:value-of select="text()"/>
</xsl:template>
What это приводит к следующему:
1 <x>23468</x> 5 <x>68</x> 7 <x>8</x>
Я почти уверен, что мне нужно использовать счетчик в выражении XPath, чтобы он не выбирал все следующие элементы с классом x, а только смежные. Но как я могу посчитать смежные? Или я делаю это неправильно?