2017-01-17 1 views
0

Ich habe eine XML-Nachricht in die Vorlage als Zeichenfolge param, so dass es in CDATA im Knoten einer anderen Nachricht gewickelt werden kann (kann dieses Szenario nicht ändern).
Ich habe Probleme mit der Flucht mehrere Abschnitte von CDATA der Nachricht, die verpackt werden soll, die eine, die als ein param kommt. Ich verwende für die FluchtArbeit mit Text innerhalb der Variable rekursiv

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

Gerade Spaltung Endsequenz ]]> in ]]]]><![CDATA[> folgende Vorlage und das funktioniert, wenn es innerhalb nur einen Block von CDATA ist. Wenn ich> 1 Blöcke habe, wird die resultierende Nachricht fehlerhaft.
Wie kann ich XSLT rekursiv auf Parameter arbeiten? Oder vielleicht durchsehen und jedes Vorkommen im Zyklus bis zu seiner Länge ersetzen?
Ich benutze XSLT 1.0 mit Xalan Prozessor.

+0

Sie die XSLT-Prozessor erklären müssen, die XSLT-Version, die Sie uns verwenden und genau sagen, welche Art der Parameter hat (string, Knoten (set), Ergebnisbaum-Fragment). –

+0

Danke für die Korrektur, hinzugefügt. – Phoenix1092

Antwort

0

Haben Sie versucht:

<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> 
+0

Vielen Dank für Ihren Vorschlag! Das werde ich heute versuchen – Phoenix1092

Verwandte Themen