以递归方式处理变量内的文本

时间:2017-01-17 20:37:22

标签: xml xslt cdata

我有一个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">&lt;![CDATA[</xsl:text>
       <xsl:value-of select="concat(substring-before($message,']]'),']]')" disable-output-escaping="yes"/>
       <xsl:text disable-output-escaping="yes">]]&gt;&lt;![CDATA[</xsl:text>
       <xsl:value-of select="substring-after($message,']]')" disable-output-escaping="yes"/>
       <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
     </xsl:when>
    <xsl:otherwise>
       <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
       <xsl:value-of select="$message"/>
       <xsl:text disable-output-escaping="yes">]]&gt;</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处理器一起使用。

1 个答案:

答案 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>