2016-06-01 12 views
2

Ich versuche, XSLT zu verwenden, um Tags/Attribute Namespace zu ändern.XSLT Attributsnamensraum mit Saxon ändern

Von XML-Eingabe:

<office:document-meta 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"> 
    <office:meta> 
    <meta:user-defined meta:name="Info 1">in</meta:user-defined> 
    </office:meta> 
</office:document-meta> 

Ich möchte XML-Ausgabe:

<office:document 
    xmlns:office="http://openoffice.org/2000/office" 
    xmlns:meta="http://openoffice.org/2000/meta"> 
    <office:meta> 
    <meta:user-defined meta:name="Info 1">in</meta:user-defined> 
    </office:meta> 
</office:document> 

Mein XSLT korrekt ändert Namensraum, mit Ausnahme von Attribut-Namensraum:

<xsl:stylesheet 
    xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
    xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <!-- Match root and output in new namespace --> 
    <xsl:template match="office:document-meta/office:meta" > 
     <office:document 
     xmlns:office="http://openoffice.org/2000/office" 
     xmlns:meta="http://openoffice.org/2000/meta" > 
     <office:meta> 
      <xsl:apply-templates select="@*|node()"/> 
     </office:meta> 
     </office:document> 
    </xsl:template> 
    <!-- 
     Expected <meta:user-defined meta:name="Info 1">in</meta:user-defined> 
     Received <meta:user-defined xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" meta:name="Info 1">in</meta:user-defined> 
    --> 
    <xsl:template match="meta:user-defined"> 
     <xsl:copy copy-namespaces="no" > 
      <xsl:attribute name="meta:name"><xsl:value-of select="@*"/></xsl:attribute> 
      <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
    </xsl:stylesheet> 

Mit dieser XSL erhalten :

<office:document 
    xmlns:office="http://openoffice.org/2000/office" 
    xmlns:meta="http://openoffice.org/2000/meta"> 
    <office:meta> 
    <meta:user-defined 
     xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
     meta:name="Info 1">in</meta:user-defined> 
    </office:meta> 
</office:document> 

Wie kann ich Saxon 9.3.0.5 anweisen, den alten Attribut-Namespace für das Attribut meta zu entfernen: name?

Wie kann ich xmlns entfernen: meta = "urn: oasis: namen: tc: opendocument: xmlns: meta: 1.0"?

Wenn jemand helfen kann, danke im Voraus!

+0

Ihr Stylesheet führt ** nicht ** zu dem von Ihnen angegebenen Ergebnis. –

Antwort

0

Ich würde es auf diese Weise tun:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:office1="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:meta1="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:office="http://openoffice.org/2000/office" 
xmlns:meta="http://openoffice.org/2000/meta" 
exclude-result-prefixes="office1 meta1"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="office1:document-meta"> 
    <office:document> 
     <xsl:apply-templates select="@*|node()"/> 
    </office:document> 
</xsl:template> 

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

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

<xsl:template match="@office1:*"> 
    <xsl:attribute name="office:{local-name()}" select="."/> 
</xsl:template> 

<xsl:template match="@meta1:*"> 
    <xsl:attribute name="meta:{local-name()}" select="."/> 
</xsl:template> 

</xsl:stylesheet> 

Das gibt:

<?xml version="1.0" encoding="UTF-8"?> 
<office:document xmlns:office="http://openoffice.org/2000/office" 
       xmlns:meta="http://openoffice.org/2000/meta"> 
    <office:meta> 
     <meta:user-defined meta:name="Info 1">in</meta:user-defined> 
    </office:meta> 
</office:document> 

, die ich ist identisch mit Ihrer erwarteten Ausgabe glauben.

+0

Vielen Dank! Ich hätte über die Umbenennung von Präfixen nach Namespaces nachgedacht. Trotz des gleichen Präfix sind die Namespaces unterschiedlich. – RemiKoutcherawy