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 -->
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
Vous devez vous connecter pour publier un commentaire.
Une chose que vous pourriez faire est de capturer l'ensemble du résultat de celle-ci dans une variable, puis vide de ses préfixes à la fin:
Lorsqu'il est exécuté sur cette entrée:
il produit:
Merci beaucoup pour l'acceptation de ma réponse. Si vous voulez montrer votre version finale, veuillez ajouter à votre texte de la question plutôt que de remplacer le contenu de mon post.
Pensé qu'il serait plus approprié de l'avoir dans la réponse que j'ai ajouté, mais pas de soucis. Je vois que vous déplacée déjà 🙂
OriginalL'auteur JLRishe
La
xmlns:xsl
approche est vraiment le "standard" de la journée, et je suppose que les concepteurs du XSL qui avait à l'esprit.Rappelez-vous que vous êtes autorisé à directement mélange de fragments XML en XSL. De ce point de vue, votre approche avec les
xsl:element
sans doute ajoute beaucoup plus de bruit et de désordre que ce que vous essayez d'éliminer avec votre "élément par défaut de l'espace de noms".Donc, je ferais ceci:
Edit:
La suite avec
namespace-alias
peut fonctionner:Ou comme ceci:
<moo>
et<xsl:element name="moo">
marcherait bien.l'avoir sur le bout de fait est un plus pour moi: il permet une meilleure lisibilité puisque je vois ce que l'élément se termine, où, ce qui n'est pas le cas avec
xsl:element
. Plus les fragments sont que vous travaillez, plus cela devient. J'utilisexsl:element
seulement quand je n'ai pas statique nom et à calculer à la volée.Eh bien, j'ai peut-être un peu de couleur avec un très ennuyeux et lent outil que nous avons à utiliser dans ce cas où il est beaucoup plus rapide pour corriger une valeur d'attribut que deux noms d'éléments. Parce que quand je change la balise d'ouverture de l'outil veut dire qu'il y a unclosed/incomparable/xml incorrecte ici et c'est très lent en me disant alors :p
Voir votre point de bien! Votre solution utilise encore l'espace de noms par défaut qui est ce que j'espérais éviter.
Re votre edit: faudrait ajouter la xmlns à chaque élément du modèle, alors?
OriginalL'auteur Lucero
Je ressens la même chose que vous à propos de l'encombrement, surtout si j'ai des feuilles de style, où l'écrasante majorité d'éléments dans le XSL espace de noms, pas dans l'espace de noms cible. La solution est simple: Donner les éléments de sortie d'un préfixe plutôt que les éléments XSL:
<element name="o:moo">
. Le problème est alors que la sortie se termine avec leo
préfixe, qui est ce que je veux éviter.Oh, oui, vous avez raison, j'ai essayé de dire quelque chose de différent. Merci pour l'astuce. Modifié la réponse en conséquence.
Ce serait le travail, mais le résultat serait le même avec une
o:
préfixe.J'ai l'habitude de ne pas s'en préoccuper. Tout analyseur XML consommer le fichier doit obtenir la droite d'une façon ou de l'autre. Mais vous avez raison, une fois, j'ai eu des problèmes là où quelqu'un d'autre a jeté quelques SVG à la sortie d'une application web qui n'était probablement pas le XHTML et eu des problèmes.
Oui, mon général, a préfixes, mais dans ce cas, il va plutôt à un vieux de la 3e partie du système qui aime être difficile 🙂
OriginalL'auteur Thomas W