J'essaie de combiner certains fichiers XML et de séparer les espaces de noms entre eux, ce qui me cause quelques problèmes. Tout ce que je suis en mesure de trouver sur ressemble tellement ceci (XSLT):Les préfixes d'espace de noms XSLT lancent une erreur de processeur
<xsl:for-each select="sbn:fieldName">
<xsl:element name="sbn:{name()}">
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:for-each>
Je veux conserver le préfixe d'espace de noms sbn:
dans la sortie, et cela fonctionne (au moins, il apparaît dans le document de résultat), mais malgré cela, le processeur lance un tas d'avertissements que sbn:
est un nom d'élément invalide ... malgré le fait que le nom de l'élément se termine correctement dans la sortie sbn:fieldName
.
Existe-t-il un autre moyen de le faire? Je ne veux pas avoir l'attribut xmlns
sur chaque élément. J'utilise Oxygen et Saxon 6.5.5 comme processeur, bien que j'aie la même erreur sur tous les autres processeurs que j'ai essayés (Xalan et la version en ligne de commande de libxslt Mac).
(Vous pouvez demander: si la sortie est bonne, pourquoi je m'en soucie? Bonne question! Je suis en train de lancer la transformation sur un petit fichier dans Oxygen, mais l'objectif est de transformer un fichier XML million le faire à partir de la ligne de commande à l'aide xsltproc
afin que je n'ai pas la charge de la mémoire de l'oxygène, puisque je vais avoir besoin de toute la mémoire que je peux obtenir pour exécuter la transformation)
Modifier. plus de détails.
Voici une version réduite du fichier sur lequel j'essaie de travailler.
<collection xmlns="http://www.example.com/ns/foo">
<record>
<fieldName>
<subA>some text</subA>
<subB>more text</subB>
</fieldName>
</record>
</collection>
Et une version réduite de la feuille de style, montrant le problème.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sbn="http://www.example.com/ns/foo"
xmlns:bar="http://www.example.com/ns/bar"
version="1.0">
<xsl:template match="//sbn:record">
<xsl:for-each select="sbn:fieldName/node()">
<xsl:element name="sbn:{local-name()}">
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Cela donne l'erreur xsltproc: runtime error: file tiny.xslt line 8 element element xsl:element: The effective name 'sbn:' is not a valid QName.
Cela l'obtient, merci! (J'ai dû changer le nom de l'élément en 'sbn: {name()}', mais ce n'est pas grave.) Je venais d'oublier ce qu'est une langue non sensuelle XSLT, où '*' sélectionne moins de 'node () '. –