2017-12-18 5 views
-1

In meinem XSLT-Code kann ich kopieren, um das Element und seine Nachkommen Knoten zu kopieren, aber der Haken ist, dass das resultierende Schema hat jedoch die gleiche Struktur hat eine andere Namensraum. Gibt es irgendeinen Weg, den ich noch kopieren und durchführen kann? Ich verwende XSLT 2.0xslt copy-of in verschiedenen Namespace im resultierenden Dokument

Nachstehend ist das Beispiel der Quell- und Ziel-XMLs, die CD-Elemente können kopiert werden mit Kopie von in XSL, aber sie haben unterschiedliche Namespaces.

Quelle XML

<catalog xmlns="namespace1"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

Ziel XML

<books xmlns="namespace2"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</books> 

Gebrauchte Martin Honnen Idee und schuf dieses

<xsl:template name="changeNamespace"> 
<xsl:param name="nodes"/> 
<xsl:for-each select="$nodes"> 
    <xsl:choose> 
    <xsl:when test="count(child::*)>0"> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:call-template name="changeNamespace"> 
      <xsl:with-param name="nodes" select="./child::*"/> 
     </xsl:call-template> 
     </xsl:element> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

+0

Können Sie bitte das Problem richtig mit Code erklären? – Shuvra

Antwort

1

Sie können nicht xsl:copy oderverwendenUm den Namensraum eines Knotens zu ändern, müssen Sie die Knoten mit z.

<xsl:template match="ns1:*"> 
    <xsl:element name="ns2:{local-name()}"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

die dann annehmen, dass Sie z. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="source-namespace" xmlns:ns2="target-namespace" version="1.0"> in Umfang oder Sie können natürlich auch setzen den Ziel-Namensraum in die xsl:element:

<xsl:template match="ns1:*"> 
    <xsl:element name="ns2:{local-name()}" namespace="target-namespace"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

Wenn Sie Attribute haben, wo Sie den Namespace müssen Sie ändern müssen, um eine ähnliche Vorlage für Attributknoten einzurichten.

Mit XSLT 2.0 können Sie die Stylesheet-Struktur mit z.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="namespace1" xmlns="namespace2" version="2.0"> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
+0

Danke Martin. Gibt es eine Möglichkeit, diese Vorlage (um den Namespace zu ändern) auszuführen, nachdem xsl: copy-of ausgeführt wurde? Ich kann die erste XSL ausführen, die xsl: copy-of hat und dann das Ergebnis verwenden, um durch eine andere XSL zu laufen, die eine Vorlage hat, um die Namespaces zu ändern, aber gibt es irgendeine Möglichkeit, diese 2 in einer XSL zu kombinieren? – jay26

+0

Ich bin mir nicht sicher, warum Sie in einem zweiten Schritt zuerst etwas kopieren möchten, um es zu transformieren, aber natürlich ist es in XSLT 2 möglich, für eine saubere Lösung würde ich Modi zur Trennung der Verarbeitungsschritte vorschlagen, dh meinen Vorschlag erstellen für einen bestimmten Modus mit der Verwendung von ' 'und drücke deine Kopie durch diesen Modus mit' '. –

Verwandte Themen