2016-09-12 5 views
0

Wie Sie das einzelne XML-Element mit schließenden Tags in xml mit Hilfe von XSL Stylesheet hinzufügen.Wie man das einzelne Element in xml mit Hilfe von xsl hinzufügt?

hier ist das unten meine xml.

<Checkpax xmlns="http://xml.api.com/test"> 
    <customerLevel> 
     <customerDetails> 
      <paxDetails> 
       <surname>MUKHERJEE</surname> 
       <type>A</type> 
       <gender>M</gender> 
      </paxDetails> 
      <otherPaxDetails> 
       <givenName>JOY</givenName> 
       <title>MR</title> 
       <age>11</age> 
      </otherPaxDetails> 
      <otherPaxDetails> 
       <title>MR</title> 
      </otherPaxDetails> 
     </customerDetails> 
     <staffDetails> 
      <staffInfo/> 
      <staffCategoryInfo> 
       <attributeDetails> 
        <attributeType>NA</attributeType> 
       </attributeDetails> 
      </staffCategoryInfo> 
     </staffDetails> 
     <productLevel> 
      <legLevel> 
       <legLevelIndicator> 
        <statusDetails> 
         <indicator>abc</indicator> 
         <action>1</action> 
        </statusDetails> 
       </legLevelIndicator> 
      </legLevel> 
     </productLevel> 
     <CustomerLevel> 
      <legLevel> 
       <legLevelIndicator> 
        <statusDetails> 
         <indicator>cde</indicator> 
         <action>1</action> 
        </statusDetails> 
       </legLevelIndicator> 
      </legLevel> 
     </CustomerLevel> 
    </customerLevel> 
</Checkpax> 

Meine XSL stylehseet:

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

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

    <xsl:template match="ns0:productLevel/ns0:legLevel/ns0:legLevelIndicator/ns0:statusDetails"> 
     <statusInformation xmlns="http://xml.api.com/test"> 
      <xsl:apply-templates/> 
     </statusInformation> 
    </xsl:template> 
    <xsl:template match="ns0:customerLevel/ns0:productLevel/legLevel"> 
     <xsl:copy-of select="."/> 
     <dumTXFSep/> 
     <dummySegmentJan /> 
     <dumTktFeb /> 
    </xsl:template> 
    <xsl:template match="ns0:customerLevel/ns0:productLevel"> 
     <xsl:copy-of select="."/> 
     <dummyRootOne /> 
    </xsl:template> 
</xsl:stylesheet> 

hier habe ich versucht, die dumTXFSep, dummySegmentJan und dumTktFeb Elemente vor der Produktebene Tag end.dummyRootOne Element hinzugefügt werden, bevor die CustomerLevel Tag end.dummyRoottwo hinzugefügt werden sollte am Ende der Produktebene hinzugefügt werden.LeglevelInfo sollte innerhalb des Tags productLevel/legLevel hinzugefügt werden.

das unten ist meine erwartete xml.

<Checkpax xmlns="http://xml.api.com/test"> 
    <customerLevel> 
     <customerDetails> 
      <paxDetails> 
       <surname>MUKHERJEE</surname> 
       <type>A</type> 
       <gender>M</gender> 
      </paxDetails> 
      <otherPaxDetails> 
       <givenName>JOY</givenName> 
       <title>MR</title> 
       <age>11</age> 
      </otherPaxDetails> 
      <otherPaxDetails> 
       <title>MR</title> 
      </otherPaxDetails> 
     </customerDetails> 
     <staffDetails> 
      <staffInfo/> 
      <staffCategoryInfo> 
       <attributeDetails> 
        <attributeType>NA</attributeType> 
       </attributeDetails> 
      </staffCategoryInfo> 
     </staffDetails> 
     <productLevel> 
      <legLevel> 
       <LeglevelInfo/> 
       <legLevelIndicator> 
        <statusDetails> 
         <indicator>abc</indicator> 
         <action>1</action> 
        </statusDetails> 
       </legLevelIndicator> 
      </legLevel> 
     </productLevel> 
     <dummyRoottwo/> 
     <CustomerLevel> 
      <legLevel> 
       <legLevelIndicator> 
        <statusDetails> 
         <indicator>cde</indicator> 
         <action>1</action> 
        </statusDetails> 
       </legLevelIndicator> 
      </legLevel> 
      <dumTXFSep/> 
      <dummySegmentJan /> 
      <dumTktFeb /> 
     </CustomerLevel> 
     <dummyRootOne /> 
    </customerLevel> 
</Checkpax> 

Sie bitte die xsl vorschlagen und mir freundlich ist hilft es Tools, die xsl durch Abbildung der zwei XML-Elemente oder eine gute Ressource für das Lernen zu erzeugen.

+0

Was funktioniert nicht? Zeigen Sie die tatsächliche Ausgabe und erklären Sie, was damit nicht stimmt. –

+0

* Wie man das einzelne xml Element mit schließenden Tags in xml * hinzufügt * was bedeutet das? Mathematisch hinzufügen oder neuen Knoten einfügen? Welches einzelne Element? Und alle Elemente in wohlgeformtem XML haben abschließende Tags. – Parfait

+0

Dies ist die, die ich als einzelnes Element nenne.Ich bin nicht vertraut mit der XML, also weiß ich nicht den richtigen Begriff. @ Parfait – sathya

Antwort

0

Die allgemeine Struktur Ihrer XSLT ist gut, mit der XSLT-Identitätsvorlage und überschreibenden Vorlagen für Elemente, die Sie ändern möchten. Das Problem ist mit ein paar von Ihnen Vorlagen. Zum einen mit diesem ...

<xsl:template match="ns0:customerLevel/ns0:productLevel"> 
    <xsl:copy-of select="."/> 
    <dummyRootOne /> 
</xsl:template> 

Das Hauptproblem hier ist die Nutzung von xsl:copy-of. Dadurch wird das aktuelle Element vollständig kopiert, es werden jedoch keine Vorlagen für einen der untergeordneten Knoten ausgewählt. Das bedeutet, dass die anderen Vorlagen in Ihrem XSLT nicht mit den Nachkommenknoten abgeglichen werden. Sie sollten xsl:apply-templates hier verwenden.

Beachten Sie auch, dass Sie dummyRootOne ohne Namespace hinzufügen, aber wahrscheinlich möchten Sie es im selben Namespace wie Ihre XML hinzufügen. d.h. tun <dummyRootOne xmlns="http://xml.api.com/test" />. Alternativ können Sie einen Standard-Namespace auf Ihrem xsl:stylesheet Element definieren diese abzudecken:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://xml.api.com/test" 

Das zweite Problem (sobald der erste festgelegt ist) ist mit dieser Vorlage

<xsl:template match="ns0:customerLevel/ns0:productLevel/legLevel"> 
    <xsl:copy-of select="."/> 
    <dumTXFSep/> 
    <dummySegmentJan /> 
    <dumTktFeb /> 
</xsl:template> 

Das Problem hier (abgesehen von die Verwendung von xsl:copy-of) ist, dass Sie das Präfix ns0 von legLevel verpasst haben, so dass es nach einem Element in keinem Namespace sucht und nicht mit dem in Ihrem XML übereinstimmt, das sich in einem Namespace befindet. Ihre Frage schlägt auch vor, dass Sie das Element auch unter customerLevel abgleichen möchten.

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

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

    <xsl:template match="ns0:productLevel/ns0:legLevel/ns0:legLevelIndicator"> 
     <LeglevelInfo /> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ns0:productLevel/ns0:legLevel/ns0:legLevelIndicator/ns0:statusDetails"> 
     <statusInformation xmlns="http://xml.api.com/test"> 
      <xsl:apply-templates select="@*|node()"/> 
     </statusInformation> 
    </xsl:template> 

    <xsl:template match="ns0:customerLevel/ns0:CustomerLevel/ns0:legLevel"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     <dumTXFSep/> 
     <dummySegmentJan /> 
     <dumTktFeb /> 
    </xsl:template> 

    <xsl:template match="ns0:customerLevel/ns0:productLevel"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     <dummyRootOne /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

danke für die suggestions.its funktioniert gut.aber wie man das Element oder Checked-Out innerhalb des Tags productLevel/legLevel @Tim C – sathya

+0

Ich habe eine Vorlage hinzugefügt, um mit einem ' 'Element.Ich lasse das Hinzufügen ' Karo-Out' als Übung für Sie, nicht zuletzt, weil es nicht in Ihrer ursprünglichen Frage erwähnt wird. Vielen Dank! –

+0

ja die ganze Arbeit zu geben ist nicht good.thanks tim.i werden versuchen, hier @ Tim C – sathya

Verwandte Themen