2016-06-09 2 views
0

Ich habe unter XMl:Kopieren Eingang xml ausgeben und entfernen Sie unerwünschte Namespace aus ihm

<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns="http:test/201/2" 
xmlns:m0="http:test/201/3" 
xmlns:ns0="http:test/201/4" 
xmlns:ns2="http:test/201/5" 
xmlns:ns1="http:test/201/6" 
xmlns:ns3="http:test/201/7" 
xmlns:ns6="http:test/201/8" 
xmlns:ns4="http:test/201/9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soap:Header> 
<ns0:ResponseHeader> 
<ns:Env>Dev</ns:Env> 
<ns:Version>1</ns:Version> 
<ns:Server></ns:Server> 
<ns:Name>NAME</ns:Name> 
</ns0:ResponseHeader> 
</soap:Header> 
<soap:Body> 
<ns2:ResponseData> 
<ns2:Employee > 
<ns2:MessageList xsi:type="ns3:Info"> 
<ns2:Message> 
<ns4:Type>new</ns4:Type> 
<ns4:Code>2</ns4:Code> 
<ns4:Source>Emp</ns4:Source> 
<ns4:Description>new hire</ns4:Description> 
</ns2:Message> 
</ns2:MessageList> 
<ns2:MessageList xsi:type="ns3:Info"> 
<ns2:Message> 
<ns4:Type>new</ns4:Type> 
<ns4:Code>1</ns4:Code> 
<ns4:Source>contract</ns4:Source> 
<ns4:Description>new hire</ns4:Description> 
</ns2:Message> 
</ns2:MessageList> 
</ns2:Employee> 
</ns2:ResponseData> 
</soap:Body> 
</soap:Envelope> 

Meine Forderung ist, kopieren komplette Eingabe-XML-Elemente und Attribute zur Ausgabe von XML umfassen alle Namespaces außer xmlns: soap =“ http://schemas.xmlsoap.org/soap/envelope/ ". So Wunsch Ausgang ist:

Meine Anforderung wird, kopiert komplette Eingabe-XML-Elemente und Attribute zur Ausgabe von XML umfasst alle Namespaces außer xmlns: soap = „http://schemas.xmlsoap.org/soap/envelope/“. So Wunsch Ausgang ist:

<Envelope 
xmlns:ns="http:test/201/2" 
xmlns:m0="http:test/201/3" 
xmlns:ns0="http:test/201/4" 
xmlns:ns2="http:test/201/5" 
xmlns:ns1="http:test/201/6" 
xmlns:ns3="http:test/201/7" 
xmlns:ns6="http:test/201/8" 
xmlns:ns4="http:test/201/9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Header> 
<ns0:ResponseHeader> 
<ns:Env>Dev</ns:Env> 
<ns:Version>1</ns:Version> 
<ns:Server></ns:Server> 
<ns:Name>NAME</ns:Name> 
</ns0:ResponseHeader> 
</Header> 
<Body> 
<ns2:ResponseData> 
<ns2:Employee > 
<ns2:MessageList xsi:type="ns3:Info"> 
<ns2:Message> 
<ns4:Type>new</ns4:Type> 
<ns4:Code>2</ns4:Code> 
<ns4:Source>Emp</ns4:Source> 
<ns4:Description>new hire</ns4:Description> 
</ns2:Message> 
</ns2:MessageList> 
<ns2:MessageList xsi:type="ns3:Info"> 
<ns2:Message> 
<ns4:Type>new</ns4:Type> 
<ns4:Code>1</ns4:Code> 
<ns4:Source>contract</ns4:Source> 
<ns4:Description>new hire</ns4:Description> 
</ns2:Message> 
</ns2:MessageList> 
</ns2:Employee> 
</ns2:ResponseData> 
</Body> 
</Envelope> 
+0

Die Ausgabe enthält 'soap: Envelope' so dass es einige' Xmlns haben muss: Seife = "..." 'Erklärung. –

+0

Mein schlechtes. Soap-Präfix-Elemente werden durch lokale Namen ersetzt. deshalb ist es nicht erforderlich. so ist die endgültige Wunschausgabe. – Mike

+0

Bearbeiten Sie die Codebeispiele Ihrer Frage so, dass sie die gewünschte Ausgabe widerspiegeln. Es scheint, dass Sie auch schon eine ähnliche Frage mit einer akzeptierten Lösung gepostet haben, ist diese Frage anders? Wenn ja warum? –

Antwort

0

Wenn Sie alle soap:foo Elemente foo Elemente in keinem Namensraum zu transformieren möchten, und entfernen Sie den soap Namespace dann

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    exclude-result-prefixes="xs soap" 
    version="2.0"> 

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

    <xsl:template match="soap:*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:copy-of select="namespace::*[not(. = namespace-uri(current()))]"/> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

mit ausreichen sollte, Ihr Wurzelelement unter der Annahme in ist Der Soap-Namespace und enthält alle Namespacedeklarationen im Gültigkeitsbereich.

Wenn ich über XSLT auf die Eingangsprobe anwenden

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns="http:test/201/2" 
    xmlns:m0="http:test/201/3" 
    xmlns:ns0="http:test/201/4" 
    xmlns:ns2="http:test/201/5" 
    xmlns:ns1="http:test/201/6" 
    xmlns:ns3="http:test/201/7" 
    xmlns:ns6="http:test/201/8" 
    xmlns:ns4="http:test/201/9" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Header> 
     <ns0:ResponseHeader> 
      <ns:Env>Dev</ns:Env> 
      <ns:Version>1</ns:Version> 
      <ns:Server></ns:Server> 
      <ns:Name>NAME</ns:Name> 
     </ns0:ResponseHeader> 
    </soap:Header> 
    <soap:Body> 
     <ns2:ResponseData> 
      <ns2:Employee > 
       <ns2:MessageList xsi:type="ns3:Info"> 
        <ns2:Message> 
         <ns4:Type>new</ns4:Type> 
         <ns4:Code>2</ns4:Code> 
         <ns4:Source>Emp</ns4:Source> 
         <ns4:Description>new hire</ns4:Description> 
        </ns2:Message> 
       </ns2:MessageList> 
       <ns2:MessageList xsi:type="ns3:Info"> 
        <ns2:Message> 
         <ns4:Type>new</ns4:Type> 
         <ns4:Code>1</ns4:Code> 
         <ns4:Source>contract</ns4:Source> 
         <ns4:Description>new hire</ns4:Description> 
        </ns2:Message> 
       </ns2:MessageList> 
      </ns2:Employee> 
     </ns2:ResponseData> 
    </soap:Body> 
</soap:Envelope> 

in Ihrem Beitrag dann Saxon 9.6 schafft das Ergebnis

<?xml version="1.0" encoding="UTF-8"?><Envelope xmlns:ns="http:test/201/2" xmlns:m0="http:test/201/3" xmlns:ns0="http:test/201/4" xmlns:ns2="http:test/201/5" xmlns:ns1="http:test/201/6" xmlns:ns3="http:test/201/7" xmlns:ns6="http:test/201/8" xmlns:ns4="http:test/201/9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Header> 
     <ns0:ResponseHeader> 
      <ns:Env>Dev</ns:Env> 
      <ns:Version>1</ns:Version> 
      <ns:Server/> 
      <ns:Name>NAME</ns:Name> 
     </ns0:ResponseHeader> 
    </Header> 
    <Body> 
     <ns2:ResponseData> 
      <ns2:Employee> 
       <ns2:MessageList xsi:type="ns3:Info"> 
        <ns2:Message> 
         <ns4:Type>new</ns4:Type> 
         <ns4:Code>2</ns4:Code> 
         <ns4:Source>Emp</ns4:Source> 
         <ns4:Description>new hire</ns4:Description> 
        </ns2:Message> 
       </ns2:MessageList> 
       <ns2:MessageList xsi:type="ns3:Info"> 
        <ns2:Message> 
         <ns4:Type>new</ns4:Type> 
         <ns4:Code>1</ns4:Code> 
         <ns4:Source>contract</ns4:Source> 
         <ns4:Description>new hire</ns4:Description> 
        </ns2:Message> 
       </ns2:MessageList> 
      </ns2:Employee> 
     </ns2:ResponseData> 
    </Body> 
</Envelope> 
+0

über Xslt funktioniert gut erwarten, dass es Soap-Namespace-Attribut kopieren Kind Element von Soap-Präfix-Element.

> – Mike

+0

Ich habe den Code mit dem von Ihnen geposteten Eingabebeispiel getestet und das Ergebnis in die Antwort aufgenommen. Es gibt keine' xmlns: soap'-Deklaration, so dass Sie uns detailliert mitteilen müssen, welchen XSLT-Prozessor Sie verwendet haben wenn du das Problem wirklich hast. –

+0

Ich verwende in Datapower über Xslt-Code, den Sie gepostet haben. – Mike

0

Data implementiert nur XSLT 1.0, nicht 2.0.

Sie können Ihre Namensräume durch Kopieren steuern:

<xsl:copy> 
    <xsl:element name="ns:Element" namespace="http://www.xml.com/ns"> 
</xsl:copy> 
Verwandte Themen