2016-11-14 4 views
0

Dies ist mein XML mit SOAP-Header und Körper:XSLT - Löschen Präfixnamensraum bestimmten Knoten XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <RequestResponse xmlns="http://tempuri.org/"> 
      <a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:Message>Message text testing.</a:Message> 
       <a:Response>false</a:Response> 
      </a:RequestResult> 
     </RequestResponse> 
    </s:Body> 
</s:Envelope> 

ich müssen vom RequestResult Knoten nur das Präfix löschen. Daraus

<a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

An:

<RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 

Dies ist die XSLTKonfigurationsdatei, die ich mit der Version 2 verwenden:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <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/Testing"> 
      <xsl:namespace name="a" 
       select="'http://schemas.datacontract.org/2004/07/MockupTesting'" /> 
      <xsl:namespace name="i" 
       select="'http://www.w3.org/2001/XMLSchema-instance'" /> 
      <!-- <xsl:copy-of select="namespace::*" /> --> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Was sollte ich hinzufügen oder ändern, dass zu entfernen Präfix auf diesem Knoten?

+1

Sie können nicht „löschen“ ein Namespacepräfix und in den allermeisten Fällen muss man so etwas nicht machen. Kannst du erklären, warum du denkst, dass es in deinem Fall notwendig ist? – Tomalak

+0

Da die WSDL, die ich konsumiere, benötigt @Tomalak – gtx911

+0

Sorry, das ist keine befriedigende Erklärung. Ich fragte: "Warum brauchst du es?" und du hast geantwortet "Weil ich es brauche." Ich denke, Sie müssen einen besseren Grund dafür geben. – Tomalak

Antwort

0

Sie können ein Präfix nicht von einem Knoten löschen. Ein Präfix ist Teil des Knotennamens. Um einen Präfix zu entfernen, müssen Sie einen neuen Knoten mit einem anderen Namen erstellen und möglicherweise - wie in Ihrem Beispiel - in einem anderen Namensraum:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting"> 
<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="a:RequestResult"> 
    <xsl:element name="RequestResult" namespace="http://tempuri.org/"> 
     <xsl:copy-of select="namespace::*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Aber wenn ich diesen Namespaces hinzufügen, wird es nicht funktionieren – gtx911

+0

@ gtx911 Bitte hör auf zu reden in Rätseln. Die obige Transformation liefert das ** genaue ** Ergebnis, das Sie verlangt haben. Wenn Sie etwas anderes möchten, bearbeiten Sie Ihre Frage und klären Sie. Das gleiche gilt für Ihre andere Frage: http://stackoverflow.com/a/40589393/3016153 –

Verwandte Themen