2016-07-18 7 views
1

Bitte beachten Sie die XSLT, Eingabe XML, gewünschte Ausgabe XML und die tatsächliche Ausgabe, ich bin unten.Wie Namespacepräfix bei der Durchführung der XSLT-Verarbeitung beibehalten wird

  • Ich muss alle Tags entfernen, wenn es keinen Wert oder keine Leerzeichen hat. zB entfernen <abc></abc>
  • die unter XSLT verwenden, werden die leeren Tags selbstschließenden Tags umgewandelt (was ich total entfernen möchten), Auch die Namensräumen entfernt werden immer zB: <soapenv:Body> wird zu <Body>umgewandelt (was ich so behalten möchte)
  • Bitte helfen Sie mir, die gewünschte Ausgabe ohne Namespacepräfix zu erreichen.

XSLT

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="grandParent"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <childValues> 
       <xsl:value-of select="normalize-space(.)" /> 
      </childValues> 
      <xsl:apply-templates select="node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>    

Eingang XML--

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" userName="sigma" sessionId="_sessionId"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <PortNumber>2</PortNumber> 
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr></UserDescr> 
        <SubscriberID></SubscriberID> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

gewünschte Ausgangs XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- Port Number removed-->     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

tatsächliche Ausgang:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <Body> 
    <rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    message-id="81"> 
     <edit-config> 
     <target> 
      <url/> 
     </target> 
     <config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- want to remove this PortNumber completely--> 
       <PortNumber/>     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </config> 
      </edit-config> 
     </rpc> 
     </Body> 
    </Envelope> 
+0

** 1 ** Ihr Problem nicht Ihren Code wiedergegeben werden - siehe: http: // XslTransform .net/94rmq7j - ** 2. ** Es gibt kein "grandParent" -Element in Ihrer XML-Eingabe, die zweite Vorlage tut also nichts. –

+1

Danke Michael, ich bin sehr neu und aus irgendeinem Grund muss ich es so schnell wie möglich arbeiten lassen. Ich stimme zu, dass dies bei Online-Xslt-Parsern funktioniert, aber in der Umgebung, die ich versuche, und in einem unternehmensspezifischen Tool, das auf Java basiert, werden die Namespacepräfixe entfernt. Irgendein Zeiger darauf, was schiefgehen könnte oder was ich überprüfen sollte. – Ramesh

+1

Ich nehme an, Sie wissen, dass die Knoten Ihres Ausgabedokuments immer noch im richtigen Namespace sind (der Namespace wird * nicht * entfernt) und jeder Parser oder jedes XML-Verarbeitungstool sollte funktionieren, unabhängig davon, ob Sie einen Standardnamespace festlegen oder den Namespace festlegen explizit über ein Präfix. –

Antwort

2

Elemente zu entfernen, die keinen Inhalt haben, können Sie

<xsl:template match="*[not(child::node())]"/>

Wie andere bemerkt haben, eine Template-Regel hinzufügen können, ist der Verlust von Namespace-Informationen einen Fehler in der Toolchain verwendet werden. Ich würde vorschlagen, (a) genau festzustellen, welche Toolchain verwendet wird, (b) zu prüfen, ob spätere Versionen der gleichen Tools existieren, in denen der Fehler möglicherweise behoben wurde, (c) dies nicht zu tun, zu einem anderen XSLT-Prozessor und/oder XML zu wechseln Parser.

Manchmal ist der einfachste Weg, um herauszufinden, was XSLT-Prozessor verwendet wird, ist so etwas wie hinzufügen:. Kann

<xsl:template match="/"> 
    <xsl:comment>Generated using <xsl:value-of select="system-property('xsl:vendor')"/></xsl:comment> 
    <xsl:apply-templates/> 
</xsl:template>