2013-03-20 6 views
9

Ich mag würde einige CDATA Tags um einige XML-TagsCDATA in eine XML-Datei hinzufügen

XML-Quelle ist (es ist nur ein kleiner Teil meiner Datei)

<teaserText_fr> 
<div xmlns:xlink="http://www.w3.org/1999/xlink xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
</div> 
</teaserText_fr> 

hinzufügen Was ich möchte ist

<teaserText_fr> 
<![CDATA[ 
<div xmlns:xlink="http://www.w3.org/1999/xlink"  xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
</div> 
]]> 
</teaserText_fr> 

Mein xslt ist

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output 
    method="html" 
    encoding="UTF-8" 
    omit-xml-declaration="yes" 
    doctype-public="-//W3C//DTD HTML 4.01//EN" 
    doctype-system="http://www.w3.org/TR/html4/strict.dtd" 
    indent="yes" /> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="teaserText_fr"> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 

Was ich erhalte, ist

</teaserText_de><![CDATA[<div xmlns="http://www.coremedia.com/2003/richtext-1.0" xmls:xlink="http://www.w3.org/1999/xlink"><p>à partir du 10 janvier, ARTE diffuse "I love democracy", une série documentaire qui, en cette grand année électorale, prend le pouls démocratique de la planète.</p></div>]]><addTeaserText_de> 

ich meine teaserText_fr Tags verloren, ich verstehe nicht, warum

Wenn möglich, möchte ich so für einige zusätzliche Tags tun (mit Regexp wie [add|]TeaserText_[fr|de], aber ich kann es nicht funktionieren ... "

Ich habe einige Tests den ganzen Tag lang, aber ich war kein Erfolg voll.

Mit freundlichen Grüßen, Guillaume

Antwort

13

Sie müssen entweder dies tun:

<xsl:template match="teaserText_fr"> 
    <xsl:copy> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
</xsl:template> 

Oder diese:

<xsl:template match="teaserText_fr"> 
    <teaserText_fr> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </teaserText_fr> 
</xsl:template> 

(ich den ersten Ansatz empfehlen)

und Sie sollten sei alles eingestellt.

die gleiche Behandlung zu jedem Element zu geben, dessen Name beginnt mit "teaserText_":

<xsl:template match="*[starts-with(local-name(), 'teaserText_')]"> 
    <xsl:copy> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="*"/>  
    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text> 
    </xsl:copy> 
</xsl:template> 
+0

Dank JLRishe, es funktioniert mit dem ersten Ansatz (auch wenn ich nicht verstehe jetzt alles in Ordnung). Wie könnte ich regexp hinzufügen, um das gleiche Ergebnis für teaserTest_de zu erhalten. – glmrenard

+2

Alles, was ich getan habe, war eine 'xsl: copy' hinzuzufügen, die eine flache Kopie des Context Node macht (in diesem Fall ist es ein' teaserText_fr'). Im Wesentlichen, wenn der aktuelle Knoten ein Element ist, setzt er Tags für das aktuelle Element um was drin ist. Ich bin nicht sicher, dass Sie eine Regex brauchen, um auch "teaserText_de" zu behandeln; Wie wäre es mit der Vorlage, die ich am Ende meiner Antwort hinzugefügt habe? – JLRishe

2

Ein sauberer Ansatz Verwendung von cdata Schnitt-Elemente machen

Delcare teaserText_fr wäre in CDATA-Abschnitt-Elemente, wie unten

<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-16" 
standalone="yes" cdata-section-elements="teaserText_fr" /> 

dann formatiere das XSLT wie folgt. (Zu beachten ist, dass Sie CDATA als Wrapper um das Element enthalten muss)

<xsl:template match="/"> 
    <teaserText_fr> 
     <![CDATA[ 
      <div xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.coremedia.com/2003/richtext-1.0"><p>2012 ist für viele Länder ein wichtiges Wahljahr. Die Reihe fühlt der weltweiten Demokratie auf den Zahn. </p> 
      </div> 
     ]]> 
    </teaserText_fr> 
</xsl:template>