Всем доброго времени суток.
В общем, ситуация такая. Имеются исходники документации в DocBook XML 4.5, которые я сейчас переформатирую в DocBook 5.
И в старых исходниках периодически встречаются места, в которых текстовые ноды лежат в качестве прямых потомков узлов, которые в DocBook 5 уже не предполагают возможности такого расположения. Более того, при этом эта текстовая нода может еще содержать один или несколько inline-тегов.
К примеру:
<entry>
<para>какой то параграф</para>
<itemizedlist/>
просто текст с каким то <sgmltag>инлайн-тегом</sgmltag>
</entry>
Соответственно, при переводе из старого формата в новый (есть там один скриптик), оксиген начинает сильно ругаться на подобные вещи.
Я пытаюсь отловить подобные ноды, но что то как то пока безуспешно
Текущий шаблон следующий (он еще заодно все потомки , которые не в параграфах, перемещает в para):
<xsl:template match="*[parent::entry]">
<xsl:choose>
<xsl:when test="self::para">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<para>
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</para>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()[parent::entry]">
<xsl:variable name="varTest">
<xsl:value-of select="normalize-space(.)"/>
</xsl:variable>
<xsl:if test="$varTest != ''">
<para>
<xsl:copy-of select="normalize-space(.)"/>
</para>
</xsl:if>
</xsl:template>
По итогу применения, эти два шаблона на выходе дадут XML вида:
<entry>
<para>какой то параграф</para>
<para><itemizedlist/></para>
<para>просто текст с каким то </para><para><sgmltag>инлайн-тегом</sgmltag></para>
</entry>
Конечный вывод не радует, надо как то перенести всю строку вместе с
sgmltag внутрь одного
para, а как получить именно всю текстовую ноду + инлайн тег внутри нее, не понятно.
Руками просто это все править я умахаюсь, исходников сотни файлов, хотелось бы как то автоматизировать..