Ich habe diese xml umbenennen:ein Element mit Xslt
<pos:getPositionRouter xmlns:pos="positionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</pos:getPositionRouter>
und ich möchte das Element pos:getPositionRouter
zu x:getPosition
mit Xslt umbenennen:
<x:getPosition xmlns:x="newPositionNS">
<positionID>
<code>1</code>
</positionID>
<parameter>?</parameter>
</x:getPosition>
Dies ist sylesheet kam ich mit:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="old_namespace" />
<xsl:param name="old_element_localname" />
<xsl:param name="new_namespace" />
<xsl:param name="new_element_localname" />
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="(local-name() = $old_element_localname) and (namespace-uri() = $old_namespace)">
<xsl:element name="{$new_element_localname}" namespace="{$new_namespace}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:when>
<!-- copy the rest as is -->
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Ich bin gezwungen, xalan als xslt Prozessor zu verwenden, und die Ausgabe ist leider das:
<getPosition xmlns="newPositionNS">
<positionID xmlns:pos="positionNS">
<code>1</code>
</positionID>
<parameter xmlns:pos="positionNS">?</parameter>
</getPosition>
Der Standard-Namespace des getPosition
Element wird zum neuen Namensraum, aber die untergeordneten Elemente ohne Namensraum (xmlns=""
) bleiben sollte.
Kann jemand verstehen warum?
Vielen Dank!
Sie beachten Sie, dass Sie den gewünschten Ausgang und dem tatsächlichen Ausgang semantisch gleich sind: '{} newPositionNS getPosition' Kinder unter null NamespaceURI, haben sie nur eine "positionNS" Namespace-URI im Bereich (wird jedoch nicht verwendet). –
Hallo Alejandro, wie ich es verstehe, die beiden Ausgaben sind nicht semantisch gleich: die Standard-Namespace-Einstellung xmlns = "newPositionNS" auf dem Root-Element wird an die Childs vererbt, so PositionID ist jetzt in der NewPositionNS Namespace, und nicht in der " "Namensraum wie er sollte. – Simon
Gute Frage, +1. Siehe meine Antwort für eine kurze und einfache Lösung. :) –