2009-04-23 5 views
3

Comment créer un ensemble de nœuds à partir de valeurs ...Comment créer un ensemble de nœuds à partir des valeurs

J'ai n nombres 1,2,3 ....... n.

Je veux créer un ensemble de nœuds

<MYNMUMS> 
<MYNUM>1</MYNUM> 
<MYNUM>2</MYNUM> 
<MYNUM>3</MYNUM> 
<MYNUM>4</MYNUM> 
.... 
<MYNUM>N</MYNUM> 
</MYNMUMS> 
+3

S'il vous plaît donner plus d'indices Qu'est-ce qu'un ensemble de nœuds, ce os, la langue, etc. –

+1

Une bonne question et la réponse à il peut être instructif de beaucoup de gens. –

Répondre

8

aussi simple que cela:

XSLT 1.0 solution:

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
    <MyNums> 
     <xsl:call-template name="generateNumNodes"> 
     <xsl:with-param name="pStart" select="1"/> 
     <xsl:with-param name="pEnd" select="10"/> 
     </xsl:call-template> 
    </MyNums> 
    </xsl:template> 

    <xsl:template name="generateNumNodes"> 
     <xsl:param name="pStart"/> 
     <xsl:param name="pEnd"/> 

     <xsl:if test="$pEnd >= $pStart"> 
     <xsl:variable name="vNumNodes" 
      select="$pStart -$pEnd+1"/> 

     <xsl:choose> 
      <xsl:when test="$vNumNodes = 1"> 
      <MyNum><xsl:value-of select="$pStart"/></MyNum> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:variable name="vHalf" select= 
       "floor(($pStart+$pEnd) div 2)"/> 
      <xsl:call-template name="generateNumNodes"> 
       <xsl:with-param name="pStart" select="$pStart"/> 
       <xsl:with-param name="pEnd" select="$vHalf"/> 
      </xsl:call-template> 

      <xsl:call-template name="generateNumNodes"> 
       <xsl:with-param name="pStart" select="$vHalf+1"/> 
       <xsl:with-param name="pEnd" select="$pEnd"/> 
      </xsl:call-template> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur tout document XML (non utilisé), produit désiré sortie:

<MyNums> 
    <MyNum>1</MyNum> 
    <MyNum>2</MyNum> 
    <MyNum>3</MyNum> 
    <MyNum>4</MyNum> 
    <MyNum>5</MyNum> 
    <MyNum>6</MyNum> 
    <MyNum>7</MyNum> 
    <MyNum>8</MyNum> 
    <MyNum>9</MyNum> 
    <MyNum>10</MyNum> 
</MyNums> 

Prenez note de ce qui suit:

  1. Le modèlegenerateNumNodesappels se récursive.

  2. Cette récursivité est à la fois le temps (O(N)), et dans l'espace (O(log2(N))) efficace et ne pratiquement déborder la pile - pas SO ici!

  3. La fonction ci-dessus est obtenue en mettant en œuvre la récursion dans un style DVC (DiVide and Conquer) . Contrairement à tail-recursion, il sera exécuté avec succès sur tout processeur XSLT conforme.

  4. La profondeur de récursivité maximale requise pour générer 1000000 (un million de nombres) est seulement 19.

XSLT 2.0 solution:

Encore plus élémentaire, pas récursion, juste en utilisant le XPath 2.0 to opérateur:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <MyNums> 
      <xsl:for-each select="1 to 10"> 
      <MyNums> 
       <xsl:sequence select="."/> 
      </MyNums> 
      </xsl:for-each> 
     </MyNums> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Vous ne pouvez pas créer un Jeu de nœuds XSLT Les nœuds sont obtenus à partir du XML source en utilisant des sélections ou des critères particuliers correspondants, mais ne peuvent pas être créés. Cette question est un peu trompeuse. La réponse sélectionnée en haut montre simplement comment convertir les données au format CSV en XML. – Lisa

0

XSLT est un langage de transformation. Il est généralement utilisé lorsque vous avez déjà des données sous la forme d'un document XML, que vous souhaitez transformer en un document différent (qui peut ou non être au format XML).

Pour commencer avec des données "brutes" et générer une représentation XML, XSLT n'est pas bien adapté.

Je vous suggère de regarder dans différentes langauges pour résoudre ce problème.

+2

Il est absolument faux que XSLT "ne soit pas bien adapté" "pour la tâche de commencer avec des données" brutes "et de générer une représentation XML". Deux exemples: 1. La fonction f: json-document() de FXSL, qui utilise un framework LR-Parsing général et un analyseur pour JSON et produit un document XML à partir d'une instance de JSON. Tout est écrit en XSLT pur. 2. Un analyseur pour XPath 2.0, écrit en XSLt, qui utilise le même framework LR-Parsing général. Références: [1] http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/func-json-document.xsl?revision=1.11&view=markup –

Questions connexes