我有一个xml消息作为字符串参数进入模板,因此可以将其包装到另一条消息的节点中的CDATA中(无法更改此方案)。
我在逃避要被包装的消息的CDATA的多个部分时遇到了麻烦,这个部分就像一个参数。我使用以下模板进行转义
<xsl:param name="message"/>
<xsl:template match="/">
<newMessage>
<savedMessage>
<xsl:choose>
<xsl:when test="contains($message,'![CDATA')">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="concat(substring-before($message,']]'),']]')" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">]]><![CDATA[</xsl:text>
<xsl:value-of select="substring-after($message,']]')" disable-output-escaping="yes"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="$message"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:otherwise>
</savedMessage>
<xsl:value-of select="/" /> <!-- Here goes content of message, that transformation was applied to -->
</newMessage>
</xsl:template>
只需将结束序列]]>
拆分为]]]]><![CDATA[>
,如果内部只有一个CDATA块,则可以正常工作。如果我在那里有> 1个块 - 结果消息变得格格不入
如何让XSLT以递归方式处理参数?或者也许仔细看看并将周期中的每一次出现更换为其长度?
我将XSLT 1.0与Xalan处理器一起使用。
答案 0 :(得分:0)
你试过了吗?
<xsl:param name="message"/>
<xsl:output method="xml" cdata-section-elements="savedMessage"/>
<xsl:template match="/">
<newMessage>
<savedMessage>
<xsl:value-of select="$message"/>
</savedMessage>
<xsl:value-of select="/" />
</newMessage>
</xsl:template>