XSLT-Stylesheet ersetzt selbstschließende Tags durch leere gepaarte Tags

8

Ich verwende XSLT, um meine ASP.Net-Datei web.config zu verarbeiten, um eine zusätzliche log4net-Konfiguration einzufügen. Es wird von der NANT-Standardaufgabe namens <style> angewendet. Während der neue Inhalt erfolgreich eingefügt wird, werden die vielen selbstschließenden Tags in leere gepaarte Tags umgewandelt. Zum Beispiel sieht eine partielle web.config wie folgt aus:

%Vor%

Nach dem Anwenden des Stylesheets sind die Tags <section> und <add> (und alle anderen Tags) nicht mehr selbstschließend:

%Vor%

Mein Stylesheet sieht so aus:

%Vor%

Bevor ich NANT zum Bearbeiten des Stylesheets verwendet habe, habe ich MSBuild ausprobiert, indem ich die Aufgabe MSCuild Extension Pack XmlTask verwendet habe. Es behielt die selbstschließenden Tags bei, würde aber die meisten Zeilenumbrüche verlieren, wodurch die Datei für den Menschen unlesbar wurde (obwohl ansonsten korrekt). Die Verwendung von NANT fügt sich gut in meinen Build-Prozess ein, also würde ich es lieber verwenden, wenn ich kann.

Es scheint, als ob ich in der Lage sein sollte, anzugeben, dass ich selbstschließende Tags im Stylesheet behalten möchte, aber ich kann nicht herausfinden, wie.

    
Carl Raymond 17.02.2011, 17:27
quelle

4 Antworten

11

Selbstschließende Tags <empty/> und leeres Element mit Start- und Ende-Tags <empty></empty> sind semantisch identisch. Daher kann der XSLT-Prozessor das ausgeben, was er am besten sieht.

Sie könnten versuchen, den Prozessor zu täuschen, indem Sie leeren Inhalt in Elementen hinzufügen. In diesem Fall kann dies durch Änderung der Identitätsvorlage erfolgen.

%Vor%

Oder Sie können dies auf leere Elemente beschränken, indem Sie die ursprüngliche Identitätsvorlage beibehalten und Folgendes hinzufügen:

%Vor%

Die Funktionalität hängt vom XSLT-Prozessor ab.

Hinweis: Ein korrektes XML-Tool sollte keinen Unterschied zwischen selbstschließenden Tags oder leeren Elementen mit Start- und End-Tags machen. Wenn dieser Syntaxunterschied Ihnen wirklich Probleme bereitet, sollten Sie überdenken, welche Methoden oder Werkzeuge Sie verwenden oder wie Sie sie verwenden.

Aktualisieren

Mist. Irgendwie habe ich deine Frage immer genau so gelesen, wie du meintest (wahrscheinlich bedeutet es, dass es Zeit für mich ist, ein Nickerchen zu machen). Also ... der Code oben versucht, selbstschließende Tags in leere Paare zu konvertieren, während Sie das Gegenteil wollen <tag></tag> - & gt; %Code%. Sorry für das Missverhältnis, lass es mich nochmal versuchen.

In einem Kommentar hast du gesagt:

  

Vorher war es in einer neuen Zeile und eingerückt in die gleiche Position wie das öffnende Tag.

Aus der Sicht des XML-Datenmodells bedeutet dies, dass der Knoten nur leere Leerzeichen als untergeordneten Inhalt hat. Eine Möglichkeit, das Kopieren dieser Textknoten zu vermeiden, wäre, eine leere Vorlage für sie bereitzustellen. Dies könnte jedoch Probleme mit gemischten Inhalten verursachen.

%Vor%

Eine andere mögliche Lösung wäre, dass wir, wenn wir leere Elemente konfrontieren, ein neues Element mit demselben Namen erstellen, anstatt es zu kopieren.

%Vor%

Diese Vorlage kopiert auch (unbenutzte) Namensraumdefinitionen in leere Elemente, was eigentlich unnötig erscheint. <tag/> wird nur an Stelle von <xsl:for-each> verwendet, weil <xsl:apply-templates> die Verwendung von template match axis nicht erlaubt. namespace funktioniert auch, wenn Sie die zusätzlichen Namespace-Definitionen nicht beibehalten möchten.

Aber am Ende, AFAIK all dies sind nur prozessorspezifische Workarounds. Wenn der XSLT 1.0-Prozessor ein leeres Element erstellt, kann er frei wählen, ob ein selbst schließendes oder ein leeres Paar verwendet werden soll. Jemand korrigiert mich bitte, wenn ich falsch liege.

    
jasso 17.02.2011, 18:58
quelle
5

Fügen Sie einfach einen Kommentar in das Element ein, es schließt sich nicht selbst.

  

& lt; xsl: Kommentar & gt; & lt; / xsl: Kommentar & gt;

    
Askkan 27.06.2012 12:19
quelle
1

Warum nicht

verwenden? %Vor%     
Dirk Pennings 13.03.2013 12:31
quelle
0

Die meisten XSLT-Prozessoren serialisieren ein leeres Element in der Ausgabe als <x/> und nicht als <x></x> . Es ist mir nicht klar, welcher XSLT-Prozessor du verwendest oder warum er dies nicht tut, aber es ist vollkommen in seinen Rechten - die beiden Konstrukte sind 100% äquivalent und jeder, der XML richtig nutzt, wird sich nicht darum kümmern, welches Formular verwendet wird.

    
Michael Kay 17.02.2011 23:36
quelle

Tags und Links