2012-04-02 5 views
0

J'ai une feuille de style XSLT qui transforme un fichier XML au format JSON et une partie du schéma pour le XML permet à n'importe quel XML quel que soit le format que j'ai besoin d'encoder comme une chaîne dans le JSON correspondant.XML XSLT Transformer en XML

J'ai les éléments en cours de création OK J'ai juste du mal à obtenir un comportement correct des espaces de noms.

Le problème est que chaque espace de noms unique dans la portée de l'élément en cours est en cours de sortie pour chaque élément unique. Je veux seulement sortir les espaces de noms comme ils sont d'abord déclarés dans le XML original.

C'est ce que j'essaie actuellement de faire, j'ai essayé quelques trucs et je n'arrive pas à trouver un moyen de faire ce dont j'ai besoin.

J'appelle un modèle qui est responsable de la transformation des attributs pour le noeud courant avec:

<xsl:call-template name="elementAttributes"> 
     <xsl:with-param name="element" select="."/> 
</xsl:call-template> 

Avec le modèle suivant:

<xsl:template name="elementAttributes"> 
     <xsl:param name="element"/> 
     <xsl:for-each select="$element/namespace::*"> 
      <!--dont include default namespace--> 
      <xsl:if test="boolean(name())"> 
       <xsl:text> </xsl:text> 
       <xsl:value-of select="name()"/> 
       <xsl:text>='</xsl:text> 
       <xsl:value-of select="."/> 
       <xsl:text>'</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
</xsl:template> 

Ainsi, par exemple avec le XML:

<valueString> 
     <dms:animal xmlns:dms="http://test.net/2012/dms/"> 
      <dms:dog>woof</dms:dog> 
      <dms:cat>meow</dms:cat> 
      <reptile:crocodile xmlns:reptile="http://reptile.test.net/2012/dms/"></reptile:crocodile> 
     </dms:animal> 
</valueString> 

Je me retrouve avec:

<dms:animal dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'> 
<dms:dog dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>woof</dms:dog> 
<dms:cat dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>meow</dms:cat> 
<reptile:crocodile dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' reptile='http://reptile.test.net/2012/dms/' xml='http://www.w3.org/XML/1998/namespace'/> 

quand je ne veux essentiellement de récupérer le même XML.

Je sais qu'il est possible de faire une copie pour copier facilement du XML vers une sortie mais depuis que je produis les résultats sous forme de texte en raison du format JSON je ne pouvais pas le faire fonctionner comme seul le texte les nœuds seraient copiés et non la structure XML.

+1

Michael Kay a raison. Jetez un oeil sur le code de mon XPath Visualizer pour voir comment cela est fait: http://www.huttar.net/dimitre/XPV/TopXML-XPV.html –

Répondre

1

Je dirais que ce que vous essayez de faire est un design plutôt bizarre. Tous mes instincts sont de revenir à l'étape des exigences et de voir si un design différent aurait plus de sens. Cependant, si vous voulez vraiment faire ce que vous essayez de faire, vous devrez examiner chaque espace de noms et le sortir seulement si l'espace de noms est dans la portée de cet élément et non pour l'élément parent.

Questions connexes