2016-11-14 2 views
0

Das ist mein XMLXSLT mit:XSLT - In zwei Namespaces in einem Knoten

<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <RequestResponse xmlns="http://tempuri.org/"> 
      <RequestResult> 
       <Message>Request inserted successfully.</Message> 
       <Response>true</Response> 
      </RequestResult> 
     </RequestResponse> 
    </s:Body> 
</s:Envelope> 

Und ich möchte zwei Namespaces hinzufügen im RequestResult Knoten (das Ergebnis ich will):

<?xml version="1.0" encoding="UTF-8"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <RequestResponse xmlns="http://tempuri.org/"> 
      <RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:Message>Request inserted successfully.</a:Message> 
       <a:Response>true</a:Response> 
      </RequestResult> 
     </RequestResponse> 
    </s:Body> 
</s:Envelope> 

ich benutze dieses XSLT:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

    <xsl:output omit-xml-declaration="yes" indent="yes" /> 

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

    <xsl:template match="/"> 
     <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
      <s:Body> 
       <xsl:apply-templates /> 
      </s:Body> 
     </s:Envelope> 
    </xsl:template> 

    <xsl:template match="RequestResult |RequestResult //*"> 
     <xsl:element name="a:{name()}" 
      namespace="http://schemas.datacontract.org/2004/07/MockupTesting"> 
      <xsl:copy-of select="namespace::*" /> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Aber ich muss den SolicitarPeticionResult Knoten (die bereits enthält einen Namespace) hinzuzufügen:

xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
+0

Es gibt es viele Antworten auf SO über das Hinzufügen von Namespaces zu XML mit XSLT - versuchen Sie es. –

+0

Ich bearbeitet, nur eine Antwort, wie zwei Namespaces zu einem Knoten hinzufügen. – gtx911

Antwort

2

So fügen Sie einen Namespace zu einem Element X, wenn (i) der Name von X bekannt ist, nicht statisch, und (ii) tatsächlich ist der Namensraum nicht im Namen von X oder in dem Namen eines seiner Attribute verwendet:

(a) in XSLT 2.0, verwenden, um die xsl:namespace Anweisung

(B) in XSLT 1.0, verwenden xsl:copy-of zu Kopieren Sie den Namespace von einem Element, das bereits diesen Namespace hat. Erstellen Sie zum Beispiel ein separates Dokument dummy.xml

<i:dummy xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/> 

und tun dann

<xsl:copy-of select="document('dummy.xml')/*/namespace::i"/> 
0

Warum tun Sie nicht einfach:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xpath-default-namespace="http://tempuri.org/"> 
<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="RequestResult"> 
    <RequestResult xmlns="http://tempuri.org/" xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <xsl:apply-templates/> 
    </RequestResult> 
</xsl:template> 

<xsl:template match="RequestResult/*"> 
    <xsl:element name="a:{name()}" namespace="http://schemas.datacontract.org/2004/07/MockupTesting"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Sorry, aber dieser Code gibt nicht die 'XML' zurück, die ich möchte. – gtx911

+0

Warum nicht: http://xsltransform.net/bFWR5Ea? –