Ich habe eine einfache XML, die aussieht
<ns0:AAA xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0">
<ns0:id extension="USER_TYPE"/>
<ns0:bb>SOME VALUE</ns0:bb>
<ns0:cc>OTHER VALUE</ns0:cc>
</ns0:AAA>
Ich versuche, ein "Wrapper"-Element um ein Element der obersten Ebene hinzuzufügen AAA
und auch das Namespace-Präfix ns0
aus der obigen XML-Datei zu entfernen. Zuletzt fügen Sie neue Elemente nach der <ns0:bb>SOME VALUE</ns0:bb>
.
Ich habe versucht, dafür ein xslt zu bauen, aber irgendwie konnte ich das Präfix beim Kopieren nicht entfernen ns0
und die neuen Elemente, die ich hinzugefügt habe, werden mit hinzugefügt xmlns=""
. Nicht sicher, was ich falsch mache.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://www.example.com">
<xsl:output method="xml" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:if test="urn:id[@extension='USER_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
<xsl:element name="cred">
<xsl:attribute name="user">test123</xsl:attribute>
<xsl:element name="password">
<xsl:attribute name="root">n</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:if>
<xsl:if test="urn:Id[@extension='ASSET_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Die Ausgabe des xslt sieht so aus
<WRAPPER xmlns="http://www.example.com" ITSVersion="XML_1.0">
<ns0:id xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extension="USER_TYPE"/>
<ns0:bb xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SOME VALUE</ns0:bb>
<ns0:cc xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OTHER VALUE</ns0:cc>
<cred xmlns="" user="test123"><password root="n"/></cred>
</WRAPPER>
Wie Sie sehen können, wurde das WRAPPER
Element korrekt hinzugefügt, aber alle anderen Elemente haben das Präfix und auch die xmlns-Attribute. Ich möchte das Präfix ns0
und xmlns
die Attribute von diesen Elementen entfernen. Und das neue Element, das ich hinzufüge cred
, wird mit einem leeren angezeigt xmlns
.
Irgendeine Idee, was ich hier falsch mache?
Vielen Dank im Voraus für Hilfe?
Lösung des Problems
Was Sie "Namespace entfernen" nennen, erfordert tatsächlich eine Umbenennung. Das bedeutet, dass Sie die Identitätstransformationsvorlage nicht verwenden können, die die verarbeiteten Knoten unverändert beibehält.
Versuchen Sie stattdessen etwas in der Art von:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<WRAPPER>
<xsl:apply-templates/>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
</xsl:template>
</xsl:stylesheet>
Angewendet auf Ihre Beispieleingabe ergibt dies:
Ergebnis
<?xml version="1.0" encoding="UTF-8"?>
<WRAPPER>
<id extension="USER_TYPE"/>
<bb>SOME VALUE</bb>
<cc>OTHER VALUE</cc>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
Beachten Sie die Verwendung von wörtlichen Ergebniselementen.
Keine Kommentare:
Kommentar veröffentlichen