2010-07-26 4 views
1

Tout d'abord bonjourXSL imbriquée pour chaque problème postion

Ok ma question, je suis en train de développer un panier open source, qui utilise le langage XML pour le stockage et xsl de style panier

1, mon xml

<items> 
    <item> 
     <item-name>vlaue</item-name> 
     <item-number>vlaue</item-number> 
     <quantity>vlaue<quantity> 
     <option> 
      <on0>vlaue</on0> 
      <os0>vlaue</os0> 
      <on1>vlaue</on1> 
      <os1>vlaue</os1> 
     </option> 
    </item> 
</items> 

Ce fichier XML sera créé pour un élément avec 2 options Depuis paypal permet un maximum de 7 options theat va être ma Figer supérieure ok mon xsl

<xsl:for-each select="item"> 
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/> 
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/> 
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/> 
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/> 
    <xsl:for-each select="option">    
     <input type='hidden' name="on{position()}_(i need this to be item postion)" value="(i need this to be "on" with the option postion appened ie "on0")"/> 
     <input type='hidden' name="os{position()}_{i need this to be item postion}" value="(i need this to be "os" with the option postion appened ie "os0")"/> 
    </xsl:for-each> 
</xsl:for-each> 

Alors, vraiment je demande ce que je peux avoir la valeur de postion de l'extérieur pour chaque passé à l'intérieur pour chaque

si quelqu'un peut l'aider serait Graet

Merci à l'avance

Tim Dodgson

+0

Point mineur, mais vous faites référence à '{@quantity}', quand 'quantité' dans le XML est un élément, pas un attribut. – Flynn1179

+1

@timdodgson: Quelle serait votre sortie désirée lors du traitement de votre échantillon d'entrée? Je vous demande cela parce que chaque réponse garde votre design de template XSLT, qui n'est pas un bon style XSLT –

Répondre

1

Je ne suis pas sûr à 100% que je comprends complètement comment le XSLT se rapporte au XML que vous avez publié. Je pense qu'il serait judicieux de modifier votre question si vous pointez clairement:

  • ce qui est le XML d'entrée
  • ce qui est le XML de sortie souhaité
  • quel est le XSLT que vous êtes aux prises avec

(je devrais probablement demander cela dans un commentaire, mais ont actuellement de recueillir assez de crédits pour le faire ...)

répondre à votre question de base (abstraire de mes confusions): vous pouvez toujours p ass une telle information positionnelle via des variables. Affectez juste la position de l'élément de contexte dans le for-each extérieur à une variable, et référez-vous à cette variable dans le for-each intérieur. Pour autant que je comprends votre feuille de style XSLT, je suppose que vous cherchez quelque chose comme ceci:

<xsl:for-each select="item"> 
    <xsl:variable name="itemPos" select="position()"/> 
    <input type='hidden' name="item_name_{position()}" value="{item-name}"/> 
    <input type='hidden' name="item_number_{position()}" value="{item-description}"/> 
    <input type='hidden' name="amount_{position()}" value="{unit-price}"/> 
    <input type='hidden' name="quantity_{position()}" value="{@quantity}"/> 
    <xsl:for-each select="option/*">    
     <input type='hidden' name="{name()}_{$itemPos}" value="{.}"/> 
    </xsl:for-each> 
</xsl:for-each> 

La position de l'élément de contexte dans l'extérieur pour-chacun est stocké dans une variable itemPos de $, qui peut être référencé plus loin.

Cordialement,

Ron

+0

Merci pour la réponse 1, l'entrée xml est ce qui est indiqué ci-dessus 2, la sortie est le contenu du panier prêt à être envoyé à paypal 3, le xslt i strugling est de savoir comment passer la valeur postion de l'extérieur pour chaque à l'intérieur pour chaque cette transfoem est d'être appelé sur le serveur à partir d'un script asp Merci beaucoup pour votre réponse Je vais voir si je peux obtenir la variable pour travailler aussi sur votre réponse comment je définirais la valeur value = "(j'ai besoin que ce soit" os "ou" on "avec l'option postion apposée" os0 ") " –

+0

Ok, j'ai édité ma réponse (comme j'avais oublié l'attribut @value dans les éléments les plus secrets ). De plus, je pense que vous voulez démarrer la boucle for-each interne pour les éléments enfants de

+0

Ron merci beaucoup, c'est presque là maintenant, je comprends enfin ce que vous me demandez lol la valeur doit égaler le contenu du nom xml si je n'étais que le codage manuel j'écrirais value = "{on0} "et value =" {os0} "pour obtenir les valeurs de mon XML, j'ai donc besoin de quelque chose comme value =" {on [postion()} "et value =" {os [postion()} "désolé de ne pas être clair au début merci beaucoup encore une fois pour votre temps et effort –

0

Pour être honnête, je reconsidère la conception de votre XML; il n'est généralement pas conseillé d'avoir l'index numérique dans le nom du tag, car il est beaucoup plus difficile de travailler avec les schémas xslt ou xsd. Je recommande quelque chose le long des lignes de:

<option> 
     <on index="0">vlaue</on> 
     <os index="0">vlaue</os> 
     <on index="1">vlaue</on> 
     <os index="1">vlaue</os> 
    </option> 

Ensuite, vous pouvez simplement prendre la position de l'attribut @Index, et vous pouvez également faire <foreach select="os"> seulement itérer tous les éléments os, par exemple.

+0

ok Merci beaucoup, vos efforts sont grands je pensais à un attribut, mais je ne savais pas s'il y avait une réponse facile xslt, vous avez répondu à ma question que vous encore –

0

Votre question n'est pas claire, mais je pense que vous avez besoin de quelque chose comme cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="items"> 
     <form> 
      <xsl:apply-templates/> 
     </form> 
    </xsl:template> 
    <xsl:template match="item|option" priority="1"> 
     <xsl:param name="pos" select="position()"/> 
     <xsl:apply-templates select="*"> 
      <xsl:with-param name="pos" select="$pos"/> 
     </xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="item/*|option/*"> 
     <xsl:param name="pos"/> 
     <input type='hidden' name="{name()}_{$pos}" value="{.}"/> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée appropriée:

<items> 
    <item> 
     <item-name>vlaue</item-name> 
     <item-number>vlaue</item-number> 
     <quantity>vlaue</quantity> 
     <option> 
      <on0>vlaue</on0> 
      <os0>vlaue</os0> 
      <on1>vlaue</on1> 
      <os1>vlaue</os1> 
     </option> 
    </item> 
</items> 

Sortie:

<form> 
    <input type="hidden" name="item-name_1" value="vlaue" /> 
    <input type="hidden" name="item-number_1" value="vlaue" /> 
    <input type="hidden" name="quantity_1" value="vlaue" /> 
    <input type="hidden" name="on0_1" value="vlaue" /> 
    <input type="hidden" name="os0_1" value="vlaue" /> 
    <input type="hidden" name="on1_1" value="vlaue" /> 
    <input type="hidden" name="os1_1" value="vlaue" /> 
</form> 

Remarque: La correspondance de modèle permet la réutilisation. @priority pour résoudre item/* et option conflit sans compter dans la récupération d'erreur. Ajouter un mannequin form pour une sortie bien formatée (Ce n'est pas vraiment nécessaire avec une feuille de style complète)