XSL-Ausgabe-XML ohne Präfix ohne Verwendung des Standard-Namespaces?
Ich besitze eine XSL-Version, in der ich die folgende Ausgabe generieren muss:
<moo xmlns="http://api.example.com">
<foo>1358944586848</foo>
<bar>
<a>1</a>
<b>2</b>
<c>3</c>
</bar>
</moo>
Ich könnte es so machen:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://api.example.com">
<xsl:template match="/">
<xsl:element name="moo">
<!-- and so on -->
Allerdings hasse ich es, das xsl-Präfix in meinen xsl-Dateien zu verwenden, weil ich das Gefühl habe, dass es sehr unübersichtlich ist. Das Auswählen mit XPath ist sowieso einfach, da Sie festlegen könnenxpath-default-namespace
zu allem, was Sie bei Bedarf umwandeln. Aber es gibt keinenelement-default-namespace
Wie kann ich also die gewünschte Ausgabe auf eine gute Weise generieren?
Ich weiß ich kann das:
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<element name="moo" namespace="http://api.example.com">
<!-- and so on -->
Aber dann muss ich diesen Namespace explizit für jedes einzelne Element festlegen, das ich erstelle, oder sie erhalten stattdessen den XSL-Namespace. Gibt es also eine saubere Möglichkeit, Elemente mit einem bestimmten Namespace (ohne Präfix) zu erstellen und den Standardnamespace der xsl-Datei nicht zu berühren?
Aktualisieren:
Dachte vielleichtnamespace-alias
könnte etwas tun, kann aber nicht herausfinden, wie man es benutzt. Versuchte dies, aber es scheint keinen Unterschied in der Ausgabe zu machen:
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:out="http://api.example.com">
<namespace-alias stylesheet-prefix="out" result-prefix=""/>
<template match="/">
<element name="out:moo">
<!-- and so on -->
Dasnamespace-alias
Das Ding tut wahrscheinlich nicht das, was ich denke: p
Die endgültige Lösung, die ich verwendet habe, basiert auf der Antwort von JLRishe
remove-prefixes.xsl
<?xml version="1.0" encoding="UTF-8"?>
<stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<variable name="result">
<next-match />
</variable>
<apply-templates select="$result" mode="remove-prefixes" />
</template>
<template match="*" priority="1" mode="remove-prefixes">
<element name="{local-name()}" namespace="{namespace-uri()}">
<apply-templates select="@* | node()" mode="remove-prefixes" />
</element>
</template>
<template match="@*|node()" mode="remove-prefixes">
<copy>
<apply-templates select="@* | node()" mode="remove-prefixes" />
</copy>
</template>
</stylesheet>
subject.xsl
<!-- snip -->
<import href="remove-prefixes.xsl" />
<!-- snip -->