XSLT: Add namespace root-element
Muss ich ändern, werden namespaces im Wurzel-element wie folgt:
input-Dokument:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"
xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
gewünschte Ausgabe:
<foo audience="external" xsi:schemaLocation="urn:isbn:1-931666-22-9
http://www.loc.gov/ead/ead.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="urn:isbn:1-931666-22-9">
Ich versuche zu tun, wie ich es kopieren über das gesamte Dokument und bevor ich jede andere transformation Anleitung, aber Folgendes funktioniert nicht:
<xsl:template match="* | processing-instruction() | comment()">
<xsl:copy copy-namespaces="no">
<xsl:for-each select=".">
<xsl:attribute name="audience" select="'external'"/>
<xsl:namespace name="xlink" select="'http://www.w3.org/1999/xlink'"/>
</xsl:for-each>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
Vielen Dank für jeden Rat!
- Gute Frage (+1). Siehe meine Antwort für ein vollständiges XSLT 1.0-und 2.0-Lösung. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
XSLT 2.0 ist nicht notwendig, um dieses problem zu lösen.
Hier ist ein XSLT 1.0-Lösung, die funktioniert genauso gut wie XSLT 2.0 (ändern Sie einfach die
version
Attribut2.0
):, Wenn die oben beschriebene transformation wird angewendet auf das XML-Dokument:
das erwartete Ergebnis produziert wird:
omit-xml-declaration="yes"
ist hilfreich für die Generierung von wohlgeformten HTML5-Ausgabe als gut.Sollten Sie wirklich mit dem "identity-Vorlage" für diese, und Sie sollten immer haben es auf der hand. Erstellen Sie eine XSLT-Datei mit dieser Vorlage, nennen es "Identität.xslt", dann in der aktuellen XSLT. Übernehmen die Vorsilbe "bad" für den namespace, den Sie ersetzen möchten, und "gut" für die, die Sie wollen, um es zu ersetzen mit, dann alles, was Sie brauchen, ist eine Vorlage wie diese (ich bin bei der Arbeit, also verzeiht die Formatierung; ich melde mich wieder, wenn ich zu Hause bin): ... Wenn das nicht funktioniert, in XSLT 1.0, verwenden Sie eine übereinstimmung Ausdruck wie "*[namespace-uri() = 'urn:bad-namespace'", und Folgen Sie Dimitre Anweisungen zum erstellen einen neuen element. Innerhalb , Sie wirklich brauchen, um einfach nur apply-template rekursiv...aber wirklich, Lesen Sie auf der identity-Vorlage.