2017-05-23 3 views
0

Kann jemand den Inhalt aller untergeordneten Knoten in xml mit xslt-Umwandlung entfernen.Alle untergeordneten Knoten und Knoten löschen Wert von xml mit xslt

Source Code

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance> 
       <CovGroupType>i8BE0F604FF6F44AEB3C36271DCBB7204</CovGroupType> 
       <CovID>r67F85BB6345E4D3893C25D1B47FA7E32</CovID> 
       <CovType>add</CovType> 
      </instance> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance> 
       <CovGroupType>i2880CCCAB9D045A3A7FFFCB6AE0C05C7</CovGroupType> 
       <CovID>rED310B0934534A8BA1CA2B5CB0BA77E5</CovID> 
       <CovType>modify</CovType> 
      </instance> 
      <change> 
       <ChangeFieldID>IA28ForgeryAndAlterationInput.Limit</ChangeFieldID> 
       <ChangeNewValue>131334</ChangeNewValue> 
      </change> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 

    </TotalResponse> 

Erwartete Ausgabe 1

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance> 
       <CovGroupType></CovGroupType> 
       <CovID></CovID> 
       <CovType></CovType> 
      </instance> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance> 
       <CovGroupType></CovGroupType> 
       <CovID></CovID> 
       <CovType></CovType> 
      </instance> 
      <change> 
       <ChangeFieldID></ChangeFieldID> 
       <ChangeNewValue></ChangeNewValue> 
      </change> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 

    </TotalResponse> 

Erwartete Ausgabe 2

<TotalResponse id="TE2146D7766F24FE683090325091EE0B4"> 
    <TotalCovIA27_CrimeResponse id="T8550FBBC76364CA699158D4087059F9A"> 
      <CovIA27_CrimeResponse> 
      <instance\> 
      </CovIA27_CrimeResponse> 
     </TotalCovIA27_CrimeResponse> 
     <TotalCovIA28_CrimeResponse id="T257F4902E7214C58ABD9258860CB6C24"> 
      <CovIA28_CrimeResponse> 
      <instance/>        
      <change/> 
      </CovIA28_CrimeResponse> 
     </TotalCovIA28_CrimeResponse> 
    </TotalResponse> 

Sowohl die aus Put wird meine Anforderung erfüllen, aber ich bevorzuge Ausgang 1.

Hinweis: Total Response ist der dynamische Stammwurzel-Name, der basierend auf der Ausgabe anderer xslts ändert.

+0

Zuerst müssen Sie klären, was Sie wollen. Wie identifiziert Ihr (oder Ihr XSL-Prozessor) die zu ändernden Elemente? Müssen Sie sie überhaupt identifizieren? Wäre es beispielsweise akzeptabel, alle 'text()' Knoten aus dem Dokument zu entfernen? Und was hast du schon probiert? –

Antwort

0

Wie ich sehe, wollen Sie eine "spezielle Behandlung" für Kinder von instance und Elemente.

In der ersten Variante wollen Sie nur die Tags ohne deren Inhalt belassen und in der zweiten Variante diese Elemente insgesamt weglassen.

Also die Lösung für den ersten Fall ist eine Vorlage, die Kind Elemente von und change was auch immer sie sind. Der Inhalt dieser Vorlage sollte nur <xsl:copy/>, , d. H. Nur eine flache Kopie dieser Elemente enthalten.

Das Skript muss auch eine Identitätsvorlage enthalten.

Im Folgenden finden Sie eine Lösung für die erste Variante:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="instance/* | change/*"> 
    <xsl:copy/> 
    </xsl:template> 

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

Wie es funktioniert:

Lets vom Ende beginnen - die -Identity-Vorlage (match="node() | @*"). Es kopiert den gesamten Quellinhalt in die Ausgabe. Dies ist die "allgemeinste" Vorlage, die alle Knoten bedient, die nicht von anderen (spezifischer) Vorlagen bedient werden. Für weitere Details suchen Sie im Internet.

Gehen Sie nun zu der Vorlage, die zu "instance/* | change/*" passt. Die match Klausel enthält 2 Teile: instance/* und change/* getrennt mit einem | (a Summe Operator sowohl über als XPath Ausdrücke).

Es bedeutet: Diese Vorlage wird jedes Element dienen, die entweder ein Kind instance oder ein Kind von change ist (und die Identität Vorlage oben dienen, werden nicht beschrieben (wird nicht) sie angewendet werden).

Gehen Sie nun zum Inhalt dieser Vorlage: <xsl:copy/>. Dieser Befehl führt eine so genannte seichte Kopie aus, d. H. Er erfüllt die Ausgabe nur mit einem leeren "Original" -Tag. Zum Beispiel Das Quellenelement <CovID>r67F8...7E32</CovID> wird als <CovID/> ausgegeben. Für weitere Details können Sie auch im Internet suchen.

Noch eine Bemerkung zu den feinen Details:

Wenn Sie dieses Skript versucht, und Sie aufmerksam sind, haben Sie vielleicht bemerkt, dass anstelle von z.B. <CovID></CovID> der Ausgang enthielt <CovID/>.

Kein Problem, aus der Sicht "XML" ist das gleich, aber kürzer. Und das ist nur die Art und Weise, wie (vermutlich alle) XSLT-Prozessoren leere Elemente generieren.

Und wenn Sie Erwarteter Ausgang 2 (Ihre zweite Variante) erhalten wollen, dann entfernen <xsl:copy/> aus der Vorlage Kinder von instance und change entspricht.

Eigentlich kann man diese Vorlage schreiben in noch prägnanter Form:

<xsl:template match="instance/* | change/*"/> 

so erhalten Sie ein leer oder nichts Vorlage tun.

+0

Danke, es hat für mich funktioniert. Kannst Du mir auch erklären, wie ich neu bei xslt bin und nicht in der Lage bin zu arbeiten. –

+0

Warum hast du gesagt "Lass vom letzten beginnen", fängt xslt immer vom letzten an oder ist das nur dieses xslt? –

+0

Ich dachte, die Erklärung wäre natürlicher, wenn ich von der Identitätsvorlage aus anfinge. –

0

wie Inhalt aller untergeordneten Knoten in xml

zu entfernen Es ist nicht klar, was du mit „Kindknoten“ bedeuten. Es sieht aus wie Sie einfach alle Textknoten von dem Eingang entfernen möchten - die sehr einfach zu tun mit:

XSLT 1,0

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

<xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Diese einfach kopiert Elemente und ihre Attribute und verwirft Knoten irgend anderer Typ.

Verwandte Themen