+1: Dies ist robuster als <xsl:text>ein Newline-Ansatz, wenn Sie etwas verwenden, das Ihre XSL-Datei neu formatieren und mit dem Leerzeichen herumspielen könnte.
Ian Roberts
49
Meine bevorzugte Methode dafür sieht ungefähr so aus:
<xsl:stylesheet><xsl:outputmethod='text'/><xsl:variablename='newline'><xsl:text></xsl:text></xsl:variable><!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
Wenn Sie dann eine neue Zeile ausgeben möchten (möglicherweise in CSV), können Sie Folgendes ausgeben:
Ich habe diese Technik bei der Ausgabe von SQL aus XML-Eingaben verwendet. Tatsächlich neige ich dazu, Variablen für Kommas, Anführungszeichen und Zeilenumbrüche zu erstellen.
Bitte beachten Sie, dass Florjons Antwort unten wesentlich stabiler ist als meine.
Nic Gibson
1
Es lohnt sich wahrscheinlich, die Deklaration xml:space="preserve"zu dem xsl:textElement hinzuzufügen , um die Stabilität zu erhöhen, aber ich würde zustimmen, dass die Antwort von @ Florjon wahrscheinlich sicherer ist.
Flynn1179
Diese Lösung hat den Nachteil, dass auch Einrückungen enthalten sind, die möglicherweise nicht wünschenswert sind.
Wmassingham
47
Fügen Sie das Attribut Method = "text" in das xsl: output-Tag ein und fügen Sie an den entsprechenden Stellen Zeilenumbrüche in Ihren Literalinhalt in der XSL ein. Wenn Sie den Quellcode Ihres XSL lieber aufgeräumt halten möchten, verwenden Sie die Entität, in der Sie eine neue Zeile wünschen.
IMHO werden nicht mehr Infos als von @Florjon angegeben benötigt. Vielleicht bleiben einige kleine Details übrig, um zu verstehen, warum es bei uns manchmal nicht funktioniert.
Zuallererst funktioniert das 
(hex) oder 
(dec) in einem <xsl:text/>immer, aber Sie können es möglicherweise nicht sehen.
In einem HTML-Markup ist kein Zeilenumbruch enthalten. Die Verwendung eines einfachen <br/>wird gut tun. Andernfalls sehen Sie einen Leerraum. Wenn Sie die Quelle im Browser anzeigen, erfahren Sie, was wirklich passiert ist. Es gibt jedoch Fälle, in denen Sie dieses Verhalten erwarten, insbesondere wenn der Verbraucher kein direkter Browser ist. Sie möchten beispielsweise eine HTML-Seite erstellen und deren Struktur mit leeren Zeilen und IDents formatieren, bevor Sie sie dem Browser bereitstellen.
Denken Sie daran, wo Sie verwenden müssen disable-output-escapingund wo nicht. Nehmen Sie das folgende Beispiel, in dem ich eine XML aus einer anderen erstellen und ihre DTD aus einem Stylesheet deklarieren musste.
Die erste Version entgeht den Zeichen (Standard für xsl: text)
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:outputmethod="xml"indent="yes"encoding="utf-8"/><xsl:templatematch="/"><xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text><xsl:copy><xsl:apply-templatesselect="*"mode="copy"/></xsl:copy></xsl:template><xsl:templatematch="@*|node()"mode="copy"><xsl:copy><xsl:apply-templatesselect="@*|node()"mode="copy"/></xsl:copy></xsl:template></xsl:stylesheet>
und hier ist das Ergebnis:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions><Userid="1"/></Subscriptions>
Ok, es macht das, was wir erwarten. Es wird ein Escape-Vorgang ausgeführt, damit die von uns verwendeten Zeichen korrekt angezeigt werden. Die XML-Teilformatierung innerhalb des Stammknotens wird von übernommen ident="yes". Bei näherer Betrachtung sehen wir jedoch, dass das Newline-Zeichen 
nicht maskiert und so wie es ist übersetzt wurde und einen doppelten Zeilenvorschub ausführt! Ich habe keine Erklärung dazu, wird gut zu wissen sein. Jemand?
Die zweite Version entgeht den Charakteren nicht und produziert das, wofür sie bestimmt sind. Die vorgenommene Änderung war:
<xsl:textdisable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
und hier ist das Ergebnis:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"><Subscriptions><Userid="1"/></Subscriptions>
und das wird ok sein. Sowohl cr als auch lf werden ordnungsgemäß gerendert.
Vergiss nicht, dass wir darüber reden nl, nicht crlf( nl=lf). Mein erster Versuch war, nur cr: zu verwenden, 
und während die Ausgabe-XML von DOM ordnungsgemäß validiert wurde.
Ich habe eine beschädigte XML-Datei angezeigt:
<?xml version="1.0" encoding="utf-8"?><Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<Userid="1"/></Subscriptions>
Der DOM-Parser ignorierte Steuerzeichen, der gerenderte jedoch nicht. Ich habe einige Zeit damit verbracht, mir den Kopf zu stoßen, bevor mir klar wurde, wie dumm ich das nicht sah!
Für die Aufzeichnung verwende ich eine Variable im Körper mit beiden CRLF, nur um 100% sicher zu sein, dass sie überall funktioniert.
Dies ermöglicht es mir, &nl;anstatt 
eine neue Zeile in der Ausgabe zu erzeugen. Wie bei anderen Lösungen wird dies normalerweise in einem <xsl:text>Tag platziert.
Ich habe jedoch die Ant-Task <echoxml> verwendet, um Stylesheets zu erstellen und sie für Dateien auszuführen. Die Aufgabe erstellt Attributwertvorlagen, z. B. $ {DSTAMP}, formatiert jedoch auch Ihre XML-Datei neu. In einigen Fällen ist daher die Entitätsreferenz vorzuziehen.
Wenn Sie eine Variable verwenden, ist es besser, selectanstelle von zu verwenden xsl:text. Beispiel: Auf <xsl:variable name="nl" select="'
'"/>diese Weise erstellen Sie kein unnötiges RTF (Ergebnisbaumfragment).
Daniel Haley
2
Ich habe einen Unterschied zwischen wörtlichen Zeilenumbrüchen in <xsl:text>und wörtlichen Zeilenumbrüchen mit festgestellt 
.
Während wörtliche Zeilenumbrüche in meiner Umgebung einwandfrei funktionierten (sowohl mit Saxon als auch mit dem Standard-Java XSLT-Prozessor), schlug mein Code fehl, als er von einer anderen Gruppe ausgeführt wurde, die in einer .NET-Umgebung ausgeführt wurde.
Durch das Ändern von entity ( 
) wurde mein Dateierzeugungscode sowohl auf Java als auch auf .NET konsistent ausgeführt.
Außerdem sind wörtliche Zeilenumbrüche anfällig für eine Neuformatierung durch IDEs und können versehentlich verloren gehen, wenn die Datei von jemandem verwaltet wird, der sich nicht auskennt.
Ich habe aus meiner Erfahrung heraus festgestellt, dass das Erstellen einer neuen Zeile INNERHALB einer <xsl:variable>Klausel nicht funktioniert. Ich habe versucht, etwas zu tun wie:
<xsl:variablename="myVar"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/><xsl:text></xsl:text><!--NEW LINE--><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar"/></div>
Alles, was ich versucht habe, in diese "neue Zeile" (den leeren <xsl:text>Knoten) einzufügen, hat einfach nicht funktioniert (einschließlich der meisten einfacheren Vorschläge auf dieser Seite), ganz zu schweigen von der Tatsache, dass HTML dort einfach nicht funktioniert, also habe ich es irgendwann getan musste es in 2 Variablen aufteilen, sie außerhalb des <xsl:variable>Gültigkeitsbereichs aufrufen und eine einfache <br/>dazwischen setzen, dh:
<xsl:variablename="myVar1"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/></xsl:when></xsl:choose><xsl:variable><xsl:variablename="myVar2"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar1"/><br/><xsl:value-ofselect="$myVar2"/></div>
Ja, ich weiß, es ist nicht die ausgefeilteste Lösung, aber es funktioniert, nur meine Frustrationserfahrung mit XSLs zu teilen;)
Ich konnte den <xsl:text>
</xsl:text>Ansatz nicht einfach verwenden, da die Entität verschwindet, wenn ich die XML-Datei mit XSLT formatiere. Also musste ich einen etwas runderen Ansatz mit Variablen verwenden
Antworten:
Der folgende XSL-Code erzeugt ein Zeilenumbruchzeichen (Zeilenvorschub):
Verwenden Sie für einen Wagenrücklauf :
quelle
<xsl:text>
ein Newline-Ansatz, wenn Sie etwas verwenden, das Ihre XSL-Datei neu formatieren und mit dem Leerzeichen herumspielen könnte.Meine bevorzugte Methode dafür sieht ungefähr so aus:
Wenn Sie dann eine neue Zeile ausgeben möchten (möglicherweise in CSV), können Sie Folgendes ausgeben:
Ich habe diese Technik bei der Ausgabe von SQL aus XML-Eingaben verwendet. Tatsächlich neige ich dazu, Variablen für Kommas, Anführungszeichen und Zeilenumbrüche zu erstellen.
quelle
xml:space="preserve"
zu demxsl:text
Element hinzuzufügen , um die Stabilität zu erhöhen, aber ich würde zustimmen, dass die Antwort von @ Florjon wahrscheinlich sicherer ist.Fügen Sie das Attribut Method = "text" in das xsl: output-Tag ein und fügen Sie an den entsprechenden Stellen Zeilenumbrüche in Ihren Literalinhalt in der XSL ein. Wenn Sie den Quellcode Ihres XSL lieber aufgeräumt halten
möchten, verwenden Sie die Entität, in der Sie eine neue Zeile wünschen.quelle
Sie können verwenden:
<xsl:text> </xsl:text>
siehe das Beispiel
Wenn Sie dies in eine Datei schreiben, z
Diese Variable erzeugt eine neue Zeileninfile wie folgt:
quelle
IMHO werden nicht mehr Infos als von @Florjon angegeben benötigt. Vielleicht bleiben einige kleine Details übrig, um zu verstehen, warum es bei uns manchmal nicht funktioniert.
Zuallererst funktioniert das


(hex) oder

(dec) in einem<xsl:text/>
immer, aber Sie können es möglicherweise nicht sehen.<br/>
wird gut tun. Andernfalls sehen Sie einen Leerraum. Wenn Sie die Quelle im Browser anzeigen, erfahren Sie, was wirklich passiert ist. Es gibt jedoch Fälle, in denen Sie dieses Verhalten erwarten, insbesondere wenn der Verbraucher kein direkter Browser ist. Sie möchten beispielsweise eine HTML-Seite erstellen und deren Struktur mit leeren Zeilen und IDents formatieren, bevor Sie sie dem Browser bereitstellen.disable-output-escaping
und wo nicht. Nehmen Sie das folgende Beispiel, in dem ich eine XML aus einer anderen erstellen und ihre DTD aus einem Stylesheet deklarieren musste.Die erste Version entgeht den Zeichen (Standard für xsl: text)
und hier ist das Ergebnis:
Ok, es macht das, was wir erwarten. Es wird ein Escape-Vorgang ausgeführt, damit die von uns verwendeten Zeichen korrekt angezeigt werden. Die XML-Teilformatierung innerhalb des Stammknotens wird von übernommen
ident="yes"
. Bei näherer Betrachtung sehen wir jedoch, dass das Newline-Zeichen

nicht maskiert und so wie es ist übersetzt wurde und einen doppelten Zeilenvorschub ausführt! Ich habe keine Erklärung dazu, wird gut zu wissen sein. Jemand?Die zweite Version entgeht den Charakteren nicht und produziert das, wofür sie bestimmt sind. Die vorgenommene Änderung war:
und hier ist das Ergebnis:
und das wird ok sein. Sowohl cr als auch lf werden ordnungsgemäß gerendert.
nl
, nichtcrlf
(nl=lf
). Mein erster Versuch war, nur cr: zu verwenden,
und während die Ausgabe-XML von DOM ordnungsgemäß validiert wurde.Ich habe eine beschädigte XML-Datei angezeigt:
Der DOM-Parser ignorierte Steuerzeichen, der gerenderte jedoch nicht. Ich habe einige Zeit damit verbracht, mir den Kopf zu stoßen, bevor mir klar wurde, wie dumm ich das nicht sah!
Für die Aufzeichnung verwende ich eine Variable im Körper mit beiden CRLF, nur um 100% sicher zu sein, dass sie überall funktioniert.
quelle
Ich habe die
DOCTYPE
Richtlinie hinzugefügt, die Sie hier sehen:Dies ermöglicht es mir,
&nl;
anstatt

eine neue Zeile in der Ausgabe zu erzeugen. Wie bei anderen Lösungen wird dies normalerweise in einem<xsl:text>
Tag platziert.quelle
Du kannst es versuchen,
Es wird klappen.
quelle
Ich habe Nic Gibsons Methode unterstützt, das war immer mein Favorit:
Ich habe jedoch die Ant-Task <echoxml> verwendet, um Stylesheets zu erstellen und sie für Dateien auszuführen. Die Aufgabe erstellt Attributwertvorlagen, z. B. $ {DSTAMP}, formatiert jedoch auch Ihre XML-Datei neu. In einigen Fällen ist daher die Entitätsreferenz vorzuziehen.
quelle
select
anstelle von zu verwendenxsl:text
. Beispiel: Auf<xsl:variable name="nl" select="'
'"/>
diese Weise erstellen Sie kein unnötiges RTF (Ergebnisbaumfragment).Ich habe einen Unterschied zwischen wörtlichen Zeilenumbrüchen in
<xsl:text>
und wörtlichen Zeilenumbrüchen mit festgestellt

.Während wörtliche Zeilenumbrüche in meiner Umgebung einwandfrei funktionierten (sowohl mit Saxon als auch mit dem Standard-Java XSLT-Prozessor), schlug mein Code fehl, als er von einer anderen Gruppe ausgeführt wurde, die in einer .NET-Umgebung ausgeführt wurde.
Durch das Ändern von entity (


) wurde mein Dateierzeugungscode sowohl auf Java als auch auf .NET konsistent ausgeführt.Außerdem sind wörtliche Zeilenumbrüche anfällig für eine Neuformatierung durch IDEs und können versehentlich verloren gehen, wenn die Datei von jemandem verwaltet wird, der sich nicht auskennt.
quelle
Ich habe aus meiner Erfahrung heraus festgestellt, dass das Erstellen einer neuen Zeile INNERHALB einer
<xsl:variable>
Klausel nicht funktioniert. Ich habe versucht, etwas zu tun wie:Alles, was ich versucht habe, in diese "neue Zeile" (den leeren
<xsl:text>
Knoten) einzufügen, hat einfach nicht funktioniert (einschließlich der meisten einfacheren Vorschläge auf dieser Seite), ganz zu schweigen von der Tatsache, dass HTML dort einfach nicht funktioniert, also habe ich es irgendwann getan musste es in 2 Variablen aufteilen, sie außerhalb des<xsl:variable>
Gültigkeitsbereichs aufrufen und eine einfache<br/>
dazwischen setzen, dh:Ja, ich weiß, es ist nicht die ausgefeilteste Lösung, aber es funktioniert, nur meine
Frustrationserfahrungmit XSLs zu teilen;)quelle
Ich konnte den
<xsl:text>
</xsl:text>
Ansatz nicht einfach verwenden, da die Entität verschwindet, wenn ich die XML-Datei mit XSLT formatiere. Also musste ich einen etwas runderen Ansatz mit Variablen verwendenquelle
füge einfach dieses Tag hinzu:
Für mich geht das ;) .
quelle