私があなたの問題を理解していれば、おそらくあなたを助けることができます... HTMLはCDATAセクションにありますか、それとも入力ドキュメントの一部として解析されますか(したがって整形式のXML)? 「テキスト置換」について話しているので、「html 形式のコンテンツ」を単一の文字列 (CDATA) として扱うため、文字列置換を実行するには再帰的な呼び出しテンプレート関数が必要であると想定します。XSL マッチング テンプレートを使用して現在行っていることを実行できるようにする唯一の方法は、解析されたドキュメント (入力ドキュメント) の html 部分を作成することです。このような場合は、b
タグを一致させて適切な出力に置き換えることができます (繰り返しますが、これは常に有効な XML として解析できることを前提としています)。あなたの問題は現在シフトしています...(私があなたの問題を正しく理解していれば)あなたが何をしたかw:t
w:r
要素を 'reopen' します... XSLT でこれをうまく行うのは (おそらくご想像のとおり) 非常に難しいため、これは困難です (テンプレート A で要素を作成し、それをテンプレート B で閉じることはできません)。これを実現するには、エスケープされていない出力などをいじり始める必要があります。私は今、多くの仮定を立てましたが、ここにあなたのやり方を助ける小さな例があります:
入力.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>
私はあなたが望んでいたものだと思います。
これが多少役立つことを願っています。