Entfernen von leeren tags aus XML via XSLT
Hatte ich eine xml von dem folgenden Muster
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<FirstName>Ahmed</FirstName>
<MiddleName/>
<LastName>Aboulnaga</LastName>
<CompanyInfo>
<CompanyName>IPN Web</CompanyName>
<Title/>
<Role></Role>
<Department>
</Department>
</CompanyInfo>
</Person>
Ich verwendet die folgenden xslt (aus Foren) in meinem Versuch, Sie zu entfernen, leere tags
<xsl:template match="@*|node()">
<xsl:if test=". != '' or ./@* != ''">
<xsl:copy>
<xsl:copy-of select = "@*"/>
<xsl:apply-templates />
</xsl:copy>
</xsl:if>
Die xslt verwendet, ist erfolgreich bei der Beseitigung von tags wie
<Title/>
<Role></Role>
...aber schlägt fehl, wenn leere tags sind auf zwei Zeilen, zB:
<Department>
</Department>
Gibt es eine Lösung für dieses?
Gute Frage, +1. Siehe meine Antwort für eine komplette, kurze und einfache Lösung, die keine bedingten Anweisungen oder explizite Prioritäten und basiert auf den grundlegenden und leistungsstarken XSLT Entwurfsmuster -- Außerkraftsetzen der Identität herrschen.
Seien Sie vorsichtig mit deiner Ausdrucksweise. Ihre
+1 für die Frage und Mühe. Siehe meine Antwort zu wissen über die XPath-1.0-Funktion erforderlich ist, um zum erwünschten Ergebnis, und wie geht das mit nur einem einzigen template.
Die Lösungen, die dort unten Ihren Anforderungen entsprechen. Ich Frage mich, warum Sie noch nicht angenommen/gewählt werden.
Seien Sie vorsichtig mit deiner Ausdrucksweise. Ihre
department
element ist nicht leer, weil whitespace signifikant ist in XML-Elemente. Man kann sagen, es enthält nur Leerzeichen, aber man kann nicht sagen, dass es leer ist.+1 für die Frage und Mühe. Siehe meine Antwort zu wissen über die XPath-1.0-Funktion erforderlich ist, um zum erwünschten Ergebnis, und wie geht das mit nur einem einzigen template.
Die Lösungen, die dort unten Ihren Anforderungen entsprechen. Ich Frage mich, warum Sie noch nicht angenommen/gewählt werden.
InformationsquelleAutor Nikkie | 2011-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese transformation braucht keine bedingte XSLT-Anweisungen und setzt keine expliziten Schwerpunkte:
, Wenn angewandt auf das XML-Dokument:
es erzeugt die gewünschte, richtige Ergebnis:
<CompanyName>
leer ist dann auch die Ausgabe von XML-hätteFirstName, Last Name
und einen null-tag<CompanyInfo>
ist, weil alle seine Kind-Elemente sind null-tags. Das ist fair genug für die Anforderung. Aber was wäre der Aufwand incase, wenn ich will, um loszuwerden, das<CompanyInfo>
seit seiner Kind-Knoten null sind, und inturn die Eltern von<CompanyInfo>
zu (wenn (angenommen)<CompanyInfo>
ist das einzige Kind seiner Eltern und nun die gesamte Hierarchie ist null). Vielen Dank im Voraus.Für die Bequemlichkeit halber können wir davon ausgehen, dass die angegebene XML-Datei wird nur ein Teil des ursprünglichen XML-Und KFZ-Knoten wie "ROW_ID" wird immer aufgefüllt werden. Damit die AUSGABE XML nicht leer sein. Ich habe mit einem code, ignorieren können, die ein Knoten hat kein Kind-element mit Daten. Aber ich bin vor ein problem, mit dem die rekursivität, ich meine, die Eltern der Eltern von null-Knoten und so weiter..
Fügen Sie einfach
CompanyName[not(node) or not(*//node())]
dem Muster der letzten Vorlage.Dies funktioniert für das gegebene Szenario, aber was ist, wenn ich das tun möchte, rekursiv, wie in , betrachten Sie das folgende Beispiel ->
... <Rsn/> <aaa1> <bbb1> <sss/> </bbb1> </aaa1> ....
Nach der Ausführung der transformation nur die innerste-tag entfernt wird, d.h. <sss/> ; und die äußeren <rsn> entfernt ; aber ich möchte zu entfernen, das ganze <aaa1> blockVielen Dank für die schnelle Antwort , die ich gefunden habe, die erforderliche Lösung here auf SO
InformationsquelleAutor Dimitre Novatchev
Novatchev: ich weiß nicht?
Vale: der code löscht ein element, wie
<x y="" z=""/>
Ach so, du meinst löscht ein element mit leeren Parametern. Es ist, weil ich kopiert den code der Fragesteller verwendet und davon ausgegangen, dass Sie wollte, dass.
InformationsquelleAutor Bob Vale
Den tag auf zwei Zeilen ist nicht ein leeres tag. Es ist ein tag mit Leerzeichen (wie neue Linien und möglicherweise irgendeine Art von white-space-Zeichen). Die XPath-1.0-Funktion
normalize-space()
können Sie normalisieren der Inhalt des tags durch das Strippen unerwünschte neue Linien.Sobald Sie sich beworben haben die Funktion, der Inhalt des Tags Sie können dann prüfen, für die leere Zeichenfolge. Eine gute Möglichkeit, dies zu tun ist durch die Anwendung der XPath-1.0
boolean()
Funktion der Inhalt des Tags. , Wenn der Inhalt eine Zeichenfolge der Länge null sein Ergebnis wird falsch sein.Schließlich können Sie einbetten, alles leicht ändern Sie Ihre Identität transformieren. Sie brauchen nicht
xsl:if
Anweisungen oder andere zusätzliche Vorlage.Die final-Transformation wird wie folgt Aussehen:
Zusätzlicher Hinweis
Ihre
xsl:if
Anweisung ist, prüfen derzeit, auch bei leeren Parametern. So Sie tatsächlich zu entfernen auch non-empy-tags mit leeren Parametern. Es klingt nicht nur wie "Entfernen, leere tags". Also seien Sie vorsichtig, oder Sie Frage fehlen einige Details, oder Sie verwenden einen unsicheren code.InformationsquelleAutor Emiliano Poggi
Ihre Frage ist underspecified. Was bedeutet leer bedeuten? Ist
<outer>
leer hier?Anyway, hier ist ein Ansatz, der könnte passen Ihre Rechnung:
Hinweis: Sie müssen möglicherweise zu zwicken die Priorität zu Ihren Bedürfnissen passen.
InformationsquelleAutor Lumi
Ab, was ich im Netz gefunden, dies ist die richtige Antwort:
InformationsquelleAutor user3283662
Können Sie die folgenden xslt-Entferne leere tags/Attribute:
InformationsquelleAutor Vitaly Ilyuhin