2010-06-01 2 views
0

Je suis assez faible chez XSLT donc cela peut sembler évident. Voici l'échantillon XMLXSLT, les éléments de processus un par un

<term> 
    <name>cholecystocolonic fistula</name> 
    <definition>blah blah</definition> 
    <reference>cholecystocolostomy</reference> 
    </term> 

Et est le XSLT ici j'ai écrit il y a un certain temps pour le traiter

<xsl:template name="term"> 
    { 
    "dictitle": "<xsl:value-of select="name" disable-output-escaping="yes" />", 
    "html": "<xsl:value-of select="definition" disable-output-escaping="yes"/>", 
    "reference": "<xsl:value-of select="reference" disable-output-escaping="yes"/> 
} 
</xsl:template> 

Fondamentalement, je crée JSON à partir du XML.

Les exigences ont maintenant changé de sorte que le XML peut maintenant avoir plus d'une étiquette de définition et une étiquette de référence. Ils peuvent apparaître dans n'importe quel ordre, c'est-à-dire, définition, référence, référence, définition, référence.

Comment est-ce que je peux mettre à jour le XSLT pour adapter ceci? Il vaut probablement la peine de mentionner que parce que mon processeur XSLT utilise .NET, je ne peux utiliser que des commandes XSLT 1.0.

Merci beaucoup!

EDIT - Précision

C'est le genre de JSON je veux créé, étant donné l'exemple suivant XML

<term> 
    <name>cholecystocolonic fistula</name> 
    <definition>blah blah</definition> 
    <reference>cholecystocolostomy</reference> 
    <definition>XSLT is not as easy as it should be</definition> 
    <reference>qui</reference> 
    </term> 

{ 
    dictitle: "cholecystocolonic fistula", 
    html: "blah blah", 
    reference: "cholecystocolostomy", 
    html: "XSLT is not as easy as it should be", 
    reference: "qui" 
} 

Répondre

3

Les noms de propriété JSON doivent être uniques, vous ne pouvez donc pas avoir plusieurs propriétés de 'référence' de la manière que vous avez indiquée.

XML n'a pas cette restriction; vous êtes autorisé à avoir plusieurs nœuds de «référence» au même niveau.

http://metajack.im/2010/02/01/json-versus-xml-not-as-simple-as-you-think/

+0

Ah, je ne savais pas cela, c'est un peu ennuyeux:/ – qui

+0

Marqué comme la réponse car il m'a éloigné de cette approche; – qui

-1

Vous aurez besoin d'utiliser l'élément for-each.

Cela vous donnera un tableau de tous les éléments de référence:

"references": [ 
    <xsl:for-each select="reference"> 
     <xsl:if test="position() &gt; 1">,</xsl:if> 
     "<xsl:value-of select="." disable-output-escaping="yes" />" 
    </xsl:for-each> 
] 

Comme vous pouvez le voir, j'ai ajouté le [] pour le tableau et utilisé l'élément for-each à l'intérieur. La sélection de la valeur . renvoie le contenu du nœud actuel. La sortie sera (à peu près):

"references": ["foo", "bar", "baz"] 

Si cette structure JSON n'est pas ce que vous voulez, faites le moi savoir.

EDIT:

Si vous voulez préserver l'ordre, vous devez changer la structure JSON autour d'un peu:

"refsAndDefs": [ 
    <xsl:for-each select="reference|definition"> 
     <xsl:if test="position() &gt; 1">,</xsl:if> 
     "<xsl:value-of select="name()" />": "<xsl:value-of select="." disable-output-escaping="yes" />" 
    </xsl:for-each> 
] 

Et le résultat sera quelque chose le long des lignes de

"refsAndDefs": [ 
    {"reference": "foo"}, 
    {"definition": "bar"}, 
    {"definition": "baz"}, 
    {"reference": "baa"} 
] 

et cetera.

+0

Désolé, je aurais dû préciser que dans le JSON créé les balises de référence et définition doivent apparaître dans le même ordre – qui

+0

@qui: S'il vous plaît voir ma réponse à jour. –

+0

Une raison pour la downvote? –

-1

Qui,

Cela devrait générer le JSON que vous voulez, mais malheureusement, la sortie n'est pas valide JSON ...

<xsl:template match="/term"> 
    { 
      <xsl:apply-templates select="*"/> 
    } 
    </xsl:template> 

    <xsl:template match="name"> 
      "dictitle": "<xsl:value-of select="." disable-output-escaping="yes" />", 
    </xsl:template> 
    <xsl:template match="definition"> 
      "html": "<xsl:value-of select="." disable-output-escaping="yes"/>", 
    </xsl:template> 
    <xsl:template match="reference"> 
      "reference": "<xsl:value-of select="." disable-output-escaping="yes"/> 
    </xsl:template> 
Questions connexes