2016-09-30 6 views
0

Entschuldigung.Ich habe viele ähnliche Frage, aber leider die meisten von ihnen nicht für mich arbeiten.Meine Anforderung ist 1) Ich muss Namespace nur für das Stammelement mit XSLT hinzufügen 2) Ich benutze xsl: result-document, um mehrere XML-Dateien aus einer einzigen Eingabe zu generieren. Die Row-Elemente aller resultierenden Dokumente sollten einen Namespace haben.Hinzufügen von Namespace zu nur Root-Element mit xslt

Wenn ich die folgende Lösung versuche, bekomme ich XMLNS in alle meine Kind-Root-Tags. Wenn ich versuche, xsl: copy, bekomme ich Tag von Eingabe-XML, die ich nicht will, weil meine Ausgabe-Tags vollständig von meiner Eingabe abweichen.

I/p:

<einfo> 
    <employee> 
     <eid>456</eid> 
     <firstname>def</firstname> 
     <lastname>y</lastname> 
    </employee> 
</einfo> 

mein XSLT:

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Global Variables --> 
    <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
    <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 
    <xsl:template match="einfo"> 
     <xsl:for-each select="employee"> 
      <xsl:variable name="docName" select="eid"/> 
      <xsl:result-document href="{$docName}"> 
      <xsl:element name="employee" namespace="myurl"> 
      <xsl:call-template 
        name="processEmployees"> 
       <xsl:with-param name="p_firstname" 
           select="firstname"/> 
       <xsl:with-param name="p_lastname" 
           select="lastname"/> 
      </xsl:call-template> 
      </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template name="processEmployees"> 
     <xsl:param name="p_firstname"/> 
     <xsl:param name="p_lastname"/> 
     <xsl:element name="firstname"> 
      <xsl:value-of select="$p_firstname"/> 
     </xsl:element> 
     <xsl:element name="lastname"> 
      <xsl:value-of select="$p_lastname"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

tatsächliche Ausgang:

<?xml version="1.0" encoding="UTF-8"?> 
<employee xmlns="myurl"> 
    <firstname xmlns="">def</firstname> 
    <lastname xmlns="">y</lastname> 
</employee> 

Erwartete Ausgabe: Ich brauche nur Root-Element, dh Mitarbeiter Namensraum zu haben (XMLNS).

+0

Bitte senden Sie sich ein ** reproduzierbares ** Beispiel mit einem Eingang und ein ** komplett ** (vorzugsweise minimierte) Sheet - siehe: [MCVE]. - Im Allgemeinen missverstehen Sie, wie Namespaces funktionieren.Ein Standardnamespace wird geerbt. Wenn Sie nicht möchten, dass die 'address' die überschreibende No-Namespace-Deklaration hat, die sie jetzt hat, müssen Sie sie in den gleichen Namespace einfügen wie ihre Heimatadresse 'home'. Ebenso für alle anderen Elemente im Ergebnisbaum. –

Antwort

0
I just need name space for tag and not for all the other child tag. 

Sie sind verwirrt zwischen Namespace-Knoten und Namespace-Deklarationen. Das xmlns = "" wird dem untergeordneten Element hinzugefügt, da sich das untergeordnete Element in der Ergebnisstruktur in einem anderen als dem übergeordneten Element befindet. Wenn Sie xmlns = "" nicht möchten, schlägt das vor, dass das Kind in dem gleichen Namespace wie dem Eltern sein soll. Sie haben uns die processAdd-Vorlage nicht gezeigt, aber der Beweis ist, dass sie eine Adresse in keinem Namespace erstellt, wenn sie eine Adresse im Namespace myurl erstellen soll.

+0

@ michael.hor257k, Michael Kay, Sorry für verwirrend..Ich habe I/P, XSLT und Ausgabe gepostet, um das Szenario zu erklären..hoffe dies hilft .. –

0

Warum gehst du nicht einfach tun:

XSLT 2,0

<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="/einfo"> 
    <xsl:for-each select="employee"> 
     <xsl:result-document href="{eid}"> 
      <employee xmlns="myurl"> 
       <firstname> 
        <xsl:value-of select="firstname" /> 
       </firstname> 
       <lastname> 
        <xsl:value-of select="lastname" /> 
       </lastname> 
      </employee> 
     </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

Hinweis:

Auf den ersten Blick mag es scheinen, dass:

<firstname> 
    <xsl:value-of select="firstname" /> 
</firstname> 

verkürzt werden konnte:

<xsl:copy-of select="firstname" /> 

Allerdings ist das nicht wahr. Das literale Ergebniselement <firstname> im Stylesheet erbt den Namespace seines übergeordneten Elements <employee xmlns="myurl">. Schreiben:

<employee xmlns="myurl"> 
    <firstname> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

ist genau das gleiche wie das Schreiben:

<employee xmlns="myurl"> 
    <firstname xmlns="myurl"> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

OTOH, wenn Sie das Original firstname Element aus der XML-Quell kopieren, wird es in seiner ursprünglichen namesepace (No-Namespace kopiert werden in dieser Fall), und wird in der Ausgabe erscheinen als:

<firstname xmlns=""> 
Verwandte Themen