¿XML de salida XSL sin prefijo sin usar el espacio de nombres predeterminado?
Tengo un XSL donde necesito generar resultados a lo largo de las líneas de esto:
<moo xmlns="http://api.example.com">
<foo>1358944586848</foo>
<bar>
<a>1</a>
<b>2</b>
<c>3</c>
</bar>
</moo>
Yo podría hacerlo así:
<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 -->
Sin embargo, odio usar el prefijo xsl en mis archivos xsl porque siento que lo desordena mucho. La selección con XPath es fácil de todos modos ya que puede configurarxpath-default-namespace
a lo que sea que estés transformando si es necesario. Pero no hayelement-default-namespace
disponible hasta donde puedo ver, entonces, ¿cómo puedo generar la salida deseada de una buena manera?
Sé que puedo hacerlo:
<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 -->
Pero luego tengo que establecer este espacio de nombres explícitamente en cada elemento que creo, o terminarán con el espacio de nombres XSL. Entonces, ¿hay una manera limpia de crear elementos con un cierto espacio de nombres (sin un prefijo) y no tocar el espacio de nombres predeterminado del archivo xsl?
Actualizar:
Figurado tal veznamespace-alias
podría hacer algo, pero no puede averiguar cómo usarlo. Intenté esto, pero no parece hacer ninguna diferencia en la salida en absoluto:
<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 -->
losnamespace-alias
cosa probablemente no está haciendo lo que creo que es: p
La solución final que utilicé, basada en la respuesta de 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 -->