2016-07-05 2 views
0

ich einen Eingang xml haben -XSLT Stammnamespace entfernen und fügen Sie Namespace zu einem anderen Element

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root xmlns="http://www.somenamespace"> 
    <Child1> 
     <A>a</A> 
     <B>b</B> 
    </Child1> 
    <Child2> 
     <C>c</C> 
     <D>d</D> 
    </Child2> 
</Root> 

ich meine Ausgabe xml wollen nach der Transformation den Namespace von der Wurzel zu entfernen und sie zu Element Child1 hinzufügen, anstatt wie this-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<NewRoot> 
    <NewChild1 xmlns="http://www.somenamespace"> 
     <A>a</A> 
     <B>b</B> 
    </NewChild1> 
    <NewChild2> 
     <C>c</C> 
     <D>d</D> 
    </NewChild2> 
</NewRoot> 

Mein xslt sieht wie-

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns="http://www.somenamespace" 
      xmlns:test="http://www.somenamespace" 
      exclude-result-prefixes="test"> 
    <xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" standalone="yes"/> 
    <xsl:template match="/"> 
    <NewRoot> 
     <xsl:apply-templates select="test:Root/test:Child1"/> 
     <xsl:apply-templates select="test:Root/test:Child2"/> 
    </NewRoot> 
    </xsl:template> 
    <xsl:template match="test:Root/test:Child1"> 
     <NewChild1> <xsl:value-of select="current()"/> </NewChild1> 
    </xsl:template> 
    <xsl:template match="test:Root/test:Child2"> 
     <NewChild2> <xsl:value-of select="current()"/> </NewChild2> 
    </xsl:template> 
</xsl:stylesheet> 

Derzeit wird diese den Namespace an die NewRoot fügt Element.

+1

Sind Sie sicher, dass Sie das wollen? Dies wird viel mehr als nur "Verschieben des Namespace" tun: es wird den gesamten Zweig "Child2" von seinem Namespace in den Namespace übertragen. –

+1

Der Grund, dass NewRoot in den Namensraum 'http: // www.somenamespace' geht, liegt an der Namensraum-Deklaration' xmlns = "http: //www.somenamespace", die alle literalen Ergebniselemente betrifft, deren Name nicht vordefiniert ist. –

+0

michael.hor257k's Kommentar oben bezieht sich anscheinend auf das, was das Ausgabebeispiel des OPs tun wird (durch Verschieben der Standard-Namespace-Deklaration), nicht was das Stylesheet tut. – LarsH

Antwort

0

I würde vorschlagen, tun Sie es so:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns="http://www.somenamespace" 
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <NewRoot> 
     <xsl:apply-templates/> 
    </NewRoot> 
</xsl:template> 

<xsl:template match="ns:Child1"> 
    <NewChild1 xmlns="http://www.somenamespace"> 
     <xsl:copy-of select="*"/> 
    </NewChild1> 
</xsl:template> 

<xsl:template match="ns:Child2"> 
    <NewChild2> 
     <xsl:apply-templates mode="no-namespace"/> 
    </NewChild2> 
</xsl:template> 

<xsl:template match="*" mode="no-namespace"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Dies fügt den Namespace Child1, sondern fügt eine xmlns = „“ auf alle untergeordneten Elemente von Child1 d.h zu A und B I A und B möchten auch unter gleichen Namensraum fallen. Wie kann ich das machen? – eechpeech

+0

„* fügt eine xmlns =“ „auf alle untergeordneten Elemente von Child1 dh A und B *“ Nein, tut es nicht: http://xsltransform.net/bFN1yaj –

+0

@eechpeech: Sind Sie sicher, dass Sie laufen michael.hors Stylesheet gegen Ihre ursprüngliche XML? Es sollte niemals A und B in keinem Namensraum platzieren. Welchen XSLT-Prozessor verwenden Sie? Ich habe es mit Saxon getestet und es hat nicht getan, was du beschrieben hast. – LarsH

1

Sie können es wie folgt ändern:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:test="http://www.somenamespace" 
      exclude-result-prefixes="test"> 
    <xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" standalone="yes"/> 
    <xsl:template match="/"> 
    <NewRoot> 
     <xsl:apply-templates select="test:Root/test:Child1"/> 
     <xsl:apply-templates select="test:Root/test:Child2"/> 
    </NewRoot> 
    </xsl:template> 
    <xsl:template match="test:Root/test:Child1"> 
     <test:NewChild1> <xsl:value-of select="current()"/> </test:NewChild1> 
    </xsl:template> 
    <xsl:template match="test:Root/test:Child2"> 
     <NewChild2> <xsl:value-of select="current()"/> </NewChild2> 
    </xsl:template> 
</xsl:stylesheet> 

D.h. Deklarieren Sie keinen Standardnamespace (xmlns="..."), sondern setzen Sie NewChild1 explizit in den Namespace http://www.somenamespace.

Dies tut, was Sie gefragt haben, nämlich ändert Ihr Stylesheet, um "den Namespace von root zu entfernen und es Element Child1 hinzuzufügen"; aber es erzeugt nicht Ihre Beispielausgabe in allen Details (z. B. sind die <A> und <B> Elemente immer noch nicht erhalten, da Sie nicht um Hilfe gebeten haben). Anstatt Ihr Stylesheet vollständig neu zu schreiben, um Aspekte der Beispielausgabe zu reproduzieren, auf die Sie sich nicht konzentrieren sollten, überlasse ich es Ihnen und gebe Ihnen Feedback zu dem, wofür Sie speziell Hilfe brauchten.

In all dies wird es Zeit sparen und die Kommunikation einfacher machen, wenn Sie sicherstellen, dass Sie den Unterschied zwischen Namespace Erklärungen verstehen, Namespace Präfixe, und welche Namespace ein Element ist in.

+0

Dies führt nicht zum erwarteten Ergebnis. –

+1

@ michael.hor257k: Ich kann glauben, dass das wahr sein kann, aber es wäre hilfreicher, wenn Sie angeben, was Sie denken, das erwartete Ergebnis ist (da die Frage in diesem Punkt vage ist) oder wie es sich von dem Ergebnis der oben unterscheidet . – LarsH

+0

Die Frage hat das ** genaue ** erwartete Ergebnis - zumindest habe ich dafür den zweiten Codeblock genommen. Es sind nur 10 Zeilen, daher sollten Sie die Unterschiede sofort erkennen können. Wenn nicht, schlage ich vor, dass Sie ein Diff-Tool verwenden. –

Verwandte Themen