В настоящее время вы копируете img
и встраиваете span
в него.Кроме того, вы делаете <xsl:apply-templates select="node()|@*"/>
, который выберет дочерние узлы img
(или их нет).А для атрибутов он закончится, добавьте их к span
.
. Здесь вам не нужно xsl:choose
, поскольку вы можете добавить условие к атрибуту match
.
<xsl:template match="//img[@class='inline'][starts-with(following-sibling::node()[1][self::text()], ',')]">
Примечание. Я изменил условие, поскольку following-sibling::text()
выбирает ВСЕ текстовые элементы, следующие за узлом img
.Вы хотите получить узел сразу после узла img
, но только если это текстовый узел.
Кроме того, попытка выделить следующий текстовый узел с помощью xsl:apply-templates
, вероятно, не является правильным подходом,при условии, что у вас есть шаблон, соответствующий родительскому узлу, который выбирает все дочерние узлы (а не только img
).Я предполагаю, что вы использовали шаблон идентификации здесь.
В любом случае, попробуйте этот XSLT вместо
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="no" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//img[@class='inline'][starts-with(following-sibling::node()[1][self::text()], ',')]">
<span class="img-wrap">
<xsl:copy-of select="." />
<xsl:text>,</xsl:text>
</span>
</xsl:template>
<xsl:template match="text()[starts-with(., ',')][preceding-sibling::node()[1][self::img]/@class='inline']">
<xsl:value-of select="substring(., 2)" />
</xsl:template>
</xsl:stylesheet>