2016-10-11 4 views
2

Im Folgenden wird XSLT und Eingabe/Ausgabe-XML verwendet. Das Ausgabe-XML enthält die leeren CDATA-Elemente. Wie verhindert man das Hinzufügen ohne Ausschluss von cdata-section-Elementen? XSLTWie verhindert man das Hinzufügen der leeren CDATA-Elemente?

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output cdata-section-elements="first second" indent="yes"/> 
    <xsl:strip-space elements="first second"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Eingangs

<?xml version="1.0" encoding="UTF-8"?> 
<top> 
    <first> 
     <second/> 
    </first> 
    <first> 
     <second><![CDATA[! Please note...]]></second> 
    </first> 
</top> 

Output mit streifen Raum

<?xml version="1.0" encoding="UTF-8"?> 
<top> 
    <first> 
     <second/> 
    </first> 
    <first> 
     <second><![CDATA[! Please note...]]></second> 
    </first> 
</top> 

Ausgabe ohne streifen Raum

<?xml version="1.0" encoding="UTF-8"?> 
<top> 
    <first><![CDATA[ 
     ]]><second/><![CDATA[ 
    ]]></first> 
    <first><![CDATA[ 
     ]]><second><![CDATA[! Please note...]]></second><![CDATA[ 
    ]]></first> 
</top> 
+0

Was ist die Ausgabe, die Sie erwarten, vorausgesetzt, Sie haben das 'erste' Element als CDATA-Abschnittselement und es hat ein untergeordnetes Element? –

+0

Das obige Beispiel spiegelt die Struktur und den Inhalt der echten Dokumente wider. Die "ersten" und "zweiten" Elemente können einen CDATA-Abschnitt haben. Die obige Identitätsvorlage funktioniert wie erwartet, wenn "first" oder "second" CDATA enthält. Auch Eingabe-XML kann "Second" im "First" ohne CDATA verschachtelt haben. Ich erwartete die gleiche Ausgabe wie eine Eingabe, während ich Identitätsvorlage anwende. – senleft

+0

Ich fragte nach der erwarteten Ausgabe. Wenn Sie glauben, dass eine Identitätstransformation in XSLT CDATA-Abschnitte erhalten soll, dann wird das XML nicht von einem XML-Parser in ein XSLT/XPath-Baummodell geparst, das einfach Textknoten hat, also ein Eingabebaum ist umgewandelt in einen Ergebnisbaum, in dem Textknoten-Kindelemente bestimmter Elemente als CDATA-Abschnitte serialisiert werden können, wenn nach 'xsl: output cdata-section-elements' gefragt wird. Aber das ist ein Ergebnisbaum Serialisierungsschritt, der die Textknoten als CDATA-Abschnitt serialisiert, es hängt nicht vom Eingabemarkupformat ab. –

Antwort

1

Schlüsselwort zu der Lösung function strip-space. Gehen Sie weiter mit:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output cdata-section-elements="first"/> 
    <xsl:strip-space elements="first second"/> 
    ... 

Um genau zu sein es durch Leerzeichen Textknoten zwischen diesen beiden Knoten sind:

<first> 
    <second/> 

Die CDATA können diese Leerzeichen nicht ignorieren, sonst wäre es, den Inhalt zu ändern. Sie müssen also dem Prozessor befehlen, was mit diesen Textknoten zu tun ist.


Zweite mögliche Lösung: Sie adressieren den Leertext über Vorlage und entfernen Sie sie:

<xsl:template match="first/text()[not(normalize-space())]"/> 
0

Ich würde vorschlagen, dass Sie es so versuchen:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="second"/> 
<xsl:strip-space elements="*"/> 

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

</xsl:stylesheet> 

Obwohl ich verstehe den Punkt dieser Übung nicht ganz, da die Ausgabe identisch mit der Eingabe ist - sowohl semantisch als auch lexikalisch (außer möglicherweise der Menge der Einrückung).

Verwandte Themen