2017-05-11 5 views
0

hinzufügen Ich habe ein Problem.Wie Namespace-Element mit XSLT

Element Response muss ohne Namespaces sein (sie sind definiertes Root-Element).

Eingang XSLT:

<xsl:stylesheet 
     xpath-default-namespace="http://www.iata.org/IATA/EDIST" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:h="http://www.iata.org/IATA/EDIST" 
     version="1.0" 
     > 

    <xsl:template match="h:Response[not(h:OrderViewProcessing)]"> 
    <Response xmlns="http://www.iata.org/IATA/EDIST"> 
     <OrderViewProcessing> 
      <MarketingMessages> 
       <MarketingMessage> 
        <Text> 
         Error text 
        </Text> 
       </MarketingMessage> 
      </MarketingMessages> 
     </OrderViewProcessing> 
     <xsl:apply-templates/> 
    </Response> 
    </xsl:template> 

</xsl:stylesheet> 

Output XML:

<Response xmlns:h="http://www.iata.org/IATA/EDIST" 
      namespace="http://www.iata.org/IATA/EDIST"> 

     <OrderViewProcessing> 
     <MarketingMessages> 
      <MarketingMessage> 
       <Text> 
       Error Text 
        </Text> 
      </MarketingMessage> 
     </MarketingMessages> 
     </OrderViewProcessing> 

</Response> 

I wie XML benötigen:

<Response> 

     <OrderViewProcessing> 
     <MarketingMessages> 
      <MarketingMessage> 
       <Text> 
       Error Text 
        </Text> 
      </MarketingMessage> 
     </MarketingMessages> 
     </OrderViewProcessing> 

</Response> 

Wenn Sie Xmlns entfernen = "http://www.iata.org/IATA/EDIST" in XSLT, dann xmlns = "" in XML wird leer.

aktualisieren

Dieses Problem auf diese Weise gelöst:

<xsl:template match="h:Response[not(h:OrderViewProcessing)]"> 
    <xsl:element name="Response" namespace="http://www.iata.org/IATA/EDIST"> 
     <xsl:element name="OrderViewProcessing" namespace="http://www.iata.org/IATA/EDIST"> 
      <xsl:element name="MarketingMessages" namespace="http://www.iata.org/IATA/EDIST"> 
       <xsl:element name="MarketingMessage" namespace="http://www.iata.org/IATA/EDIST"> 
        <xsl:element name="Text" namespace="http://www.iata.org/IATA/EDIST"> 
       Error text 
        </xsl:element> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:template> 

Wahrscheinlich muss, Lösung besser sein.

+0

Das Präfix "apim" befindet sich nicht in Ihrem XSLT, daher muss es aus Ihrer XML-Eingabe stammen. Wir müssen die Eingabe-XML sehen, um herauszufinden, woher die einzelnen Namespaces kommen und in welchem ​​Kontext sich das jeweilige Element befindet. –

Antwort

1

Sie verwenden xpath-default-namespace und version = "1.0", was inkonsistent aussieht, da dieses Attribut nur in XSLT 2.0 definiert ist. Sie immer müssen uns sagen, welche Version von XSLT Sie verwenden.

Sie erstellen das Response-Element im Namespace "http://www.iata.org/IATA/EDIST" explizit, obwohl Sie sagen, dass es sich in keinem Namespace befinden soll. Warum tust du das?

Sie sagen, dass Ihre Ausgabe das Attribut namespace="http://www.iata.org/IATA/EDIST" hat, aber es gibt nichts in Ihrem XSLT, das dieses Attribut möglicherweise generieren könnte. Ich denke, das muss von einer experimentellen Variante Ihres XSLTs stammen. Wenn Sie Namespaces im Stylesheet deklarieren müssen und nicht in die Ausgabe kopiert werden sollen, sollten Sie im Element xsl: stylesheet exclude-result-prefixes="#all" angeben. Aber ich denke, hier passiert etwas mehr, das Sie nicht klar erklärt haben.

+0

Ja, Version 2.0. Vielen Dank – alexdeia