Добрый всем день.
Имею примерный кусок XML (форматирование сохраненено):
<para>Sed ut perspiciatis unde omnis iste <emphasis targetptr="Id_link">
<literal>Текст ссылки</literal>
</emphasis>, natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi.</para>
В котором между тэгами
emphasis и
literal закрались лишние пробелы.
Есть шаблон в скрипте преобразования, который меняет тип атрибута в тэге
emphasis (на вторую часть условия внимания можно не обращать, она к делу не относится):
<xsl:template match="emphasis[@targetptr]">
<xsl:choose>
<xsl:when test="descendant::node() and (not(child::text()) or ((normalize-space(child::text())) = ''))">
<xsl:element name="emphasis">
<xsl:attribute name="linkend">
<xsl:value-of select="attribute::targetptr"/>
</xsl:attribute>
<xsl:copy-of select="child::node()"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="emphasis">
<xsl:attribute name="linkend">
<xsl:value-of select="attribute::targetptr"/>
</xsl:attribute>
<xsl:value-of select="normalize-space(child::text())"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
При отработке этого скрипта проблема в том, что содержимое выводится все с теми же лишними пробелами. И вот вопрос - как нормализовать такую строку? При использовании
<value-of select="normilize-space(child::text())">
получаю на выход просто конструкцию
<emphasis>Текст ссылки</emphasis>
, а нужно сохранить структуру вложенных элементов.
При использовании
<xsl:copy-of select="descendant::node()"/>
- получаю на выходе
<emphasis> <literal>Текст ссылки</literal> Текст ссылки</emphasis