Supprimer la déclaration d'espace de noms de feuille de style XSLT avec XSLT
J'ai une feuille de style XSLT comme suit:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/">
<saxon:script language="java" implements-prefix="XQHeaderFunc" src="java:com.sonicsw.xq.service.xform.HeaderExtension" />
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="processId" select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
<xsl:value-of select="XQHeaderFunc:setProperty(XQHeaderFunc:new(),'processId',string(@id),-1)"/>
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<!-- Other stuff -->
</xsl:stylesheet>
Je veux transformer cette feuille de style à l'aide d'une deuxième feuille de style XSLT pour supprimer tout ce qui a à voir avec la XQHeaderFunc et saxon espaces de noms. Est-il un moyen pour que je puisse faire cela?
Maintenant, j'ai essayé le suivant, qui traite avec succès avec les éléments, mais la déclaration d'espace de noms n'a pas l'air de vouloir disparaître.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="XQHeaderFunc saxon">
<xsl:param name="XQHeaderReplacement" />
<xsl:variable name="apos">'</xsl:variable>
<!-- Copy all nodes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Remove saxon script tag -->
<xsl:template match="saxon:script" />
<!-- Remove elements with setProperty calls -->
<xsl:template match="*[starts-with(@select, 'XQHeaderFunc:setProperty')]" />
<!-- Replace getProperty calls with replacement value-->
<xsl:template match="@select[starts-with(., 'XQHeaderFunc:getProperty')]">
<xsl:attribute name="select">
<xsl:value-of select="concat($apos, $XQHeaderReplacement, $apos)"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
De sortie:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:variable name="processId" select="''" />
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<!-- Other stuff -->
</xsl:stylesheet>
S'il vous plaît, fournir une source complète de document XML (la 1ère feuille de style). Il y a des opérations qui doivent être réalisées dont vous ne semblez pas être au courant. En général, il suffit de retirer la déclaration d'espace de noms mène à un non-(espace)bien formé résultat et le processeur XSLT permet d'éviter ce par la génération d'une nouvelle déclaration d'espace de noms.
Mise à jour de la question plus spécifique de la source et un nouvel exemple de ce que j'ai essayé de sortir maintenant.
Votre mise à jour est utile, mais s'il vous plaît poster les résultats réels que vous obtenez à partir de votre transformation. Qui va nous aider à savoir exactement à quoi il ressemble, afin que nous puissions comprendre pourquoi il a encore le ns decl.
Ajouté la source exacte de ces deux fichiers xslt et la source de la sortie après l'exécution dans Visual Studio 2012.
OK, merci. En la regardant. Pourquoi est-il si important pour vous de retirer la déclaration d'espace de noms? Vous savez qu'il est censé ne pas avoir d'impact significatif sur la sémantique de la sortie XML, droit?
Mise à jour de la question plus spécifique de la source et un nouvel exemple de ce que j'ai essayé de sortir maintenant.
Votre mise à jour est utile, mais s'il vous plaît poster les résultats réels que vous obtenez à partir de votre transformation. Qui va nous aider à savoir exactement à quoi il ressemble, afin que nous puissions comprendre pourquoi il a encore le ns decl.
Ajouté la source exacte de ces deux fichiers xslt et la source de la sortie après l'exécution dans Visual Studio 2012.
OK, merci. En la regardant. Pourquoi est-il si important pour vous de retirer la déclaration d'espace de noms? Vous savez qu'il est censé ne pas avoir d'impact significatif sur la sémantique de la sortie XML, droit?
OriginalL'auteur Svish | 2012-09-17
Vous devez vous connecter pour publier un commentaire.
Je voudrais ajouter
sur votre
élément. Ensuite, la déclaration d'espace de noms pour
foo
va être omis si possible, c'est à dire si il n'y a pas d'éléments ou d'attributs dans cet espace à la sortie.Pour info, la raison tnat cette ligne
déclenche une erreur parce que
xmlns:foo
dans le document d'entrée n'est pas un attribut; c'est un pseudoattribute. Ce que votre match motif de demande de match est un attribut nomméfoo
c'est dans un espace de noms correspondant à un préfixe d'espace de nomsxmlns
. Puisque vous n'avez pas déclaré un préfixe d'espace de nomsxmlns
dans votre feuille de style, vous obtenez l'erreur "préfixe xmlns n'est pas défini."Mise à jour:
Je vois de votre posté sortie (et à mes propres tests) que
exclude-result-prefixes
n'a pas été efficace dans la suppression de la déclaration d'espace de noms.1) d'Abord, je voudrais demander pourquoi c'est important. Il ne change pas l'espace de noms de n'importe quoi dans votre sortie XSLT. Êtes-vous juste essayer de le retirer pour des raisons esthétiques?
2) en observant les XSLT 1.0 spec, il me semble que
<xsl:copy>
ne prête pas attention àexclude-result-prefixes
:AFAICT, seulement littérale résultat éléments omettre les noms de nœuds en fonction de
exclude-result-prefixes
.Sur cette base, je voudrais essayer de remplacer
<xsl:copy>
dans votre modèle d'identité (pour les éléments) avec<xsl:element name="{name()}">
ou une variante de celui-ci. Vous auriez alors besoin d'un autre modèle d'identité pour les non-nœuds d'élément.J'ai remplacé votre modèle d'identité avec les deux modèles suivants:
et qui a donné ce que je crois est la sortie désirée, sans superflu ns déclarations:
(J'ai ajusté l'espace pour plus de clarté.)
la clarté, veuillez distinguer entre les "espaces de noms" et ns déclarations ou ns préfixes.) Le tester. La sortie sera toujours de l'espace de noms bien formé. La transformation ci-dessus ne sera pas supprimer les espaces de noms: notez que
<xsl:template>
est toujours dans le "XSL/Transform" espace de noms. Il ne supprimera pas nécessaire ns déclarations. Si il y a quelques inutile ns déclarations que vous voulez quitter, vous aurez probablement à copier le noms des nœuds explicitement, mais qui a encore moins de sens que de vouloir supprimer inutile ns decls.Semble fonctionner parfaitement! Je vous remercie beaucoup. (Je vais essayer de vous rappeler que la distinction qui vous rend les choses plus claires 🙂
OriginalL'auteur LarsH