2013-04-02 3 views
1

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.

Répondre

1

Je pense que le problème est que vous utilisez sbn:fieldName/node() - qui correspond également aux nœuds de texte, qui n'ont pas le nom - d'où l'erreur.

Cela fonctionne pour moi:

<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/*"> 
     <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
      <xsl:value-of select="text()"/> 
     </xsl:element> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+0

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 () '. –

0

La fonction name() renvoie le nom d'un nœud avec son préfixe, dans ce cas sbn:{name()} évalue à sbn:sbn:fieldName. Au lieu de cela, vous devez utiliser, si vous voulez vous assurer que le préfixe sbn: est utilisé dans la sortie:

<xsl:element name="sbn:{local-name()}"> 

ou l'une des suivantes, si vous voulez réutiliser tout préfixe a été utilisé dans l'entrée:

<xsl:element name="{name()}"> 

ou

<xsl:copy> 
    <!-- (Whatever content you want) --> 
</xsl:copy> 
+0

Hmm ... 'local-name()' donne toujours l'erreur. Il semble qu'il n'y ait pas de différence entre la sortie de 'name' et' local-name' si je fais simplement un 'value-of' sur eux. –

+0

C'est bizarre. En relisant votre question, je vois que votre raison pour cela est de supprimer l'attribut 'xmlns' (qui n'est pas en fait un attribut). Si c'est la raison, alors je pense que vous vous y prenez de la mauvaise façon. Pourriez-vous nous montrer un exemple plus grand de votre XSLT et une partie de l'exemple d'entrée, plus la sortie actuelle qui a les déclarations 'xmlns' que vous voulez éviter? – JLRishe

+0

Voir les modifications de clarification; J'espère que cela aide. –

Questions connexes