2010-09-28 6 views
0

Ceci est le fichier XML:XSLT manipuler wont fichier XML en conséquence

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="LabXSLT.xslt"?> 
<orders> 
    <order> 
     <customerid>2364</customerid> 
     <status>pending</status> 
     <item instock="Y" itemid="SD93"> 
      <name>Flying By Roller Skates</name> 
      <price>25.00</price> 
      <qty>25</qty> 
     </item> 
     <item instock="N" itemid="B12"> 
      <name>Bounce-o Ball</name> 
      <price>.35</price> 
      <qty>150</qty> 
     </item> 
    </order> 
    <order> 
     <customerid>5268</customerid> 
     <status>complete</status> 
     <item instock="Y" itemid="Q52"> 
      <name>Crash N Burn Skis</name> 
      <price>20</price> 
      <qty>10</qty> 
     </item> 
    </order> 
</orders> 

fichier XSLT:

<xsl:for-each select="orders/order"> 
    <p>Customer Number:</p> 
    <xsl:value-of select="customerid" /> 
    <p>Name:</p> 
    <xsl:value-of select="name" /> 
</xsl:for-each> 

Le fichier XSLT est supposé obtenir custeomrID et le nom et l'afficher. Il obtient le customerID mais pas le nom. Il est seulement laissé vide et il semble qu'il ne peut atteindre que deux des éléments de nom. Je pense que l'un des problèmes est qu'il y a 2 éléments dans l'élément. Aucune idée de comment s'y prendre. Je ne peux pas changer le fichier XML aussi.

Répondre

2

Il est parfois utile de fixer l'indentation sur votre XML afin que vous puissiez voir la hiérarchie plus clairement:

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="LabXSLT.xslt"?> 
<orders> 
    <order> 
     <customerid>2364</customerid> 
     <status>pending</status> 
     <item instock="Y" itemid="SD93"> 
      <name>Flying By Roller Skates</name> 
      <price>25.00</price> 
      <qty>25</qty> 
     </item> 
     <item instock="N" itemid="B12"> 
      <name>Bounce-o Ball</name> 
      <price>.35</price> 
      <qty>150</qty> 
     </item> 
    </order> 
    <order> 
     <customerid>5268</customerid> 
     <status>complete</status> 
     <item instock="Y" itemid="Q52"> 
      <name>Crash N Burn Skis</name> 
      <price>20</price> 
      <qty>10</qty> 
     </item> 
    </order> 
</orders> 

Cela rend plus facile de voir que vous devez cibler item/name

Edit: pour accéder à chaque élément dans un noeud de commande, votre XSL pourrait ressembler à ceci:

<xsl:for-each select="orders/order"> 
    <p>Customer Number:</p> 
    <xsl:value-of select="customerid" /> 
    <xsl:for-each select="item"> 
     <p>Name:</p> 
     <xsl:value-of select="name" /> 
    </xsl:for-each> 
</xsl:for-each> 
0

L'élément name est un enfant de l'élément. Le n'apparaît pas être un élément de nom de client. Est-ce ce que vous essayez de faire, ou voulez-vous le nom de l'article?

0

Le name La balise est à l'intérieur d'une balise item. Alors, que faire lorsque plusieurs noms sont sur un client?

0

puisque le nom est sous l'élément tag

votre code doit d'imprimer le nom doit être

<xsl: value-of select ="item/name"/> 
0

Ditto ce que dit @Casey. Toutefois, si vous utilisez

<xsl:value-of select="item/name" /> 

vous n'obtiendrez le nom du premier élément, parce que ce <xsl:value-of> fait. Selon vos besoins, vous devrez peut-être changer cela.

+0

C'est vrai, bon point. ou un sous-template associé à sont deux bonnes solutions de contournement – Casey

0

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="customerid|name"> 
     <p> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 
    <xsl:template match="customerid/text()"> 
     <xsl:value-of select="concat('Customer Number: ',.)"/> 
    </xsl:template> 
    <xsl:template match="name/text()"> 
     <xsl:value-of select="concat('Name: ',.)"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

Sortie:

<p>Customer Number: 2364</p> 
<p>Name: Flying By Roller Skates</p> 
<p>Name: Bounce-o Ball</p> 
<p>Customer Number: 5268</p> 
<p>Name: Crash N Burn Skis</p> 

Remarque: le style Pull, pattern matching.