我最有可能能幫助你,如果只有我明白你的問題......就是在CDATA節的HTML或它解析爲輸入文檔(因此良好的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>
我的猜測是你想要的。
希望這有助於你一些。