2013-03-20 21 views
9

chciałbym dodać kilka CDATA tagów wokół niektórych znaczników XMLDodaj CDATA do pliku xml

źródło XML (to tylko niewielka część mojego pliku)

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

Co ja chciałoby się

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

Moja XSLT jest

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

Co mogę to

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

zgubiłem teaserText_fr tagów, nie rozumiem dlaczego

Jeśli to możliwe, chciałbym to zrobić na kilka dodatkowych znaczników (z regexp jak [add|]TeaserText_[fr|de], ale nie mogę go uruchomić ... "

Zrobiłem kilka testów przez cały dzień, ale nie był sukces pełny.

poważaniem Guillaume

Odpowiedz

13

albo trzeba to zrobić:

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

albo to:

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

(polecam pierwsze podejście)

i zalecana wszystko gotowe.

Aby dać takie samo traktowanie każdego elementu, którego nazwa zaczyna się od "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

Dzięki JLRishe działa z Twoim pierwszym podejściem (nawet jeśli teraz nie rozumiem w tej chwili). Jak mogę dodać wyrażenie regularne, aby uzyskać ten sam wynik dla teaserTest_de na przykład. – glmrenard

+2

Wszystko co zrobiłem to dodać 'xsl: copy', która wykonuje płytką kopię węzła kontekstu (w tym przypadku jest to' teaserText_fr'). Zasadniczo, gdy bieżący węzeł jest elementem, umieszcza znaczniki dla bieżącego elementu wokół tego, co jest w środku. Nie jestem pewien, czy potrzebujesz wyrażeń regularnych, aby obsłużyć "teaserText_de"; co powiesz o szablonie dodanym pod koniec mojej odpowiedzi? – JLRishe

2

Czystsze rozwiązaniem byłoby wykorzystanie CDATA-SECTION-elementów

Delcare teaserText_fr w elementach przekroju cdata poniżej:

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

Następnie sformatuj XSLT jak poniżej. (Zauważ, że musisz dołączyć CDATA jako wrapper dookoła elementu)

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