XSL XML de sortie avec aucun préfixe sans l'aide de l'espace de noms par défaut?

J'ai une feuille de style XSL où j'ai besoin de générer une sortie le long des lignes de cette:

<moo xmlns="http://api.example.com">
    <foo>1358944586848</foo>
    <bar>
        <a>1</a>
        <b>2</b>
        <c>3</c>
    </bar>
</moo>

Je pouvais le faire comme ceci:

<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 -->

Cependant, j'ai une sorte de haine à l'aide de la xsl préfixe dans mes fichiers xsl cause, je sens qu'il encombre jusqu'beaucoup. La sélection avec XPath est facile de toute façon puisque vous pouvez définir xpath-default-namespace à ce que vous êtes à la transformation de en cas de besoin. Mais il n'y a pas de element-default-namespace disponible aussi loin que je peux voir, alors comment puis-je générer la sortie dans le bon sens?

Je sais que je peux le faire:

<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 -->

Mais puis-je définir cet espace de noms explicitement sur chaque élément que j'ai créer, ils finiront avec le XSL espace de noms à la place. Donc, il y a un moyen propre à créer des éléments avec un certain espace de noms (sans préfixe) et de ne pas toucher à l'espace de noms par défaut du fichier xsl?


Mise à jour:

Pensé que peut-être namespace-alias pourrait faire quelque chose, mais impossible de trouver comment l'utiliser. Essayé cela, mais ne semble pas faire une différence dans le rendement à tout:

<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 -->

La namespace-alias chose n'est probablement pas faire ce que je pense que c'est :p

La dernière solution que j'ai utilisée, basée sur JLRishe la réponse de

retirez-les préfixes.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>

sujet.xsl

<!-- snip -->
<import href="remove-prefixes.xsl" />
<!-- snip -->
Concernant la mise à jour et namespace-alias - la seule chose qui votre échantillon pourrait atteindre, c'est que le moo est écrit comme dans le http://www.w3.org/1999/XSL/Transform espace de noms. Je n'ai jamais essayé avec le préfixe vide et je ne sais pas si c'est réellement une utilisation valide de namespace-alias (n'ai pas vérifié).
Semble que vous pouvez utiliser #default que la valeur de la namespace-alias attributs. Ne semble pas encore à faire ce que j'espérais que ce serait bien...
Je vais ajouter une modification dans les quelques secondes qui peuvent faire ce que vous voulez... l'essayer.
Je ne recommanderais pas perdre les "xsl:" prefix. Mieux, utiliser une bonne mise en forme du code. Les espaces de noms ont pour unique but de la désambiguïsation. Cacher le préfixe conduit souvent à confusion lorsque l'on travaille avec deux différents vocabulaires -- qui est exactement votre cas. Souvent, le document XML source pourrait avoir des noms d'éléments, tels que la "sortie", "élément", "attribut", "variable". Dans de tels cas, si l' :xsl:" préfixe est dépouillé, il devient difficile de distinguer ce qui est le document xml source et qui est la feuille de style XSLT. Les erreurs, ennuyeux et beaucoup de temps, ce qui pourrait arriver.
J'ai un profond respect de vos préférences personnelles. Toutefois, si ce code est destiné non seulement à vos yeux, il serait plus lisible pour tout le monde, si vous avez quitté le "xsl:" prefix intacte. Un autre facteur important est que certains XSLT IDEs seulement la syntaxe hi-éclairage si le préfixe "xsl:" est -- ils arrêtent de faire cela, même si un autre préfixe (comme "xslt:") est utilisé.

OriginalL'auteur Svish | 2013-01-23