Скорее всего, я могу помочь вам, если б я понял вашу проблему ... HTML находится в разделе CDATA или он анализируется как часть входного документа (и, следовательно, правильно сформированного XML)?
Поскольку вы говорите о «замене текста», я предполагаю, что вы рассматриваете «контент, отформатированный в html», как одну строку (CDATA), и поэтому для выполнения замены строки требуется рекурсивная функция шаблона вызова. Единственный способ использовать шаблон сопоставления XSL для выполнения того, что вы делаете сейчас, - это сделать html частью анализируемого документа (вашего входного документа). В таком случае вы можете просто сопоставить тег b
и заменить его соответствующим выводом (опять же: это предполагает, что он всегда может быть проанализирован как действительный XML). Ваша проблема теперь изменилась ... поскольку (если я правильно понял вашу проблему) вы пытаетесь закрыть элементы w:t
и w:r
, а затем снова открыть их ... это сложно, потому что это ( как вы, вероятно, подозреваете) очень сложно сделать это красиво в XSLT (вы не можете просто создать элемент в шаблоне A и затем закрыть его в шаблоне B). Вы должны начать возиться с неэкранированным выводом и т. Д., Чтобы это произошло. Теперь я сделал много предположений, но вот небольшой пример, который поможет вам на вашем пути:
Input.xml
<doc xmlns:w="urn:schemas-microsoft-com:office:word">
<w:p>
<w:r>
<w:t>before<b>bold</b>after</w:t>
</w:r>
</w:p>
</doc>
convert_html.xsl
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/doc/w:p/w:r/w:t//b">
<xsl:value-of select="'</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>'" disable-output-escaping="yes" />
<xsl:apply-templates select="@*|node()"/>
<xsl:value-of select="'</w:t></w:r><w:r><w:t>'" disable-output-escaping="yes" />
</xsl:template>
Сейчас работает
xalan input.xml convert_html.xsl
производит
<?xml version="1.0" encoding="UTF-8"?><doc xmlns:w="urn:schemas-microsoft-com:office:word">
<w:p>
<w:r>
<w:t>before</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>bold</w:t></w:r><w:r><w:t>after</w:t>
</w:r>
</w:p>
</doc>
что я думаю, это то, что вы хотели.
Надеюсь, это вам чем-нибудь поможет.