2017-02-20 3 views
0

Ich bin vor kurzem auf eine kleine Herausforderung gestoßen, während ich glaube, dass viele Leute einfach bei der -ForEach-Schleife bleiben, wie wir es normalerweise tun, versuche ich zu denken draußen und sehen, welche alternativen Wege wir eigentlich zur selben Sache haben, aber auf eine andere Art und Weise.Unterschiedlicher Weg für XSLT Schleife durch Knoten

Es gibt eine andere Möglichkeit, tatsächlich die untergeordneten Knoten in diesem XSLT durchzulaufen, aber ich habe etwas Mühe, es herauszufinden. Ich habe das Forum ohne Antwort durchforstet, aber vielleicht kann mich jemand in die richtige Richtung weisen.

sieht Meine Codes wie diese atm:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Cars</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Name</th> 
     <th>Model</th> 
     <th>regyear</th> 
     <th>price</th> 
     <th>Description</th> 
     </tr> 
     <xsl:for-each select="autoads/ad"> 
     <xsl:if test="type = 2"> 
     <tr> 
      <td><xsl:value-of select="name"/></td> 
      <td><xsl:value-of select="model"/></td> 
      <td><xsl:value-of select="regyear"/></td> 
     <td><xsl:value-of select="price"/></td>  
      <td><xsl:value-of select="adtext"/></td>  
     </tr> 
     </xsl:if> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

und die XML sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="uppgift1.xsl"?> 
<autoads> 
    <ad> 
     <type>1</type> 
     <name>Honda</name> 
     <model>XL 1000 V</model> 
     <regyear>2001</regyear> 
     <price>129900</price> 
     <adtext>2001 Honda XL 1000 V, 8.900 km. hög vindruta. Pris 129.900kr,-. </adtext> 
     <addate>20020115</addate> 
     <volume>1000</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Nissan</name> 
     <model>Almera 1.4S</model> 
     <regyear>1997</regyear> 
     <price>119000</price> 
     <adtext>1997 Nissan Almera 1.4S, 5 dörrar, met, 70.000 km. el.spegel/fönster, galv. kaross, c.lås, startspärr, airbag, nedfällb. baks. ABS, ute temp. R/CD, alarm, d.fäste, v.säten, s/v-hj. EU-godk. full service, servo. Pris 119.000 kr,-. </adtext> 
     <addate>20020118</addate> 
     <volume>0</volume> 
     <category>5 dörrar</category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Mercedes-Benz</name> 
     <model>C220 Elegance</model> 
     <regyear>1995</regyear> 
     <price>209000</price> 
     <adtext>1995 Mercedes-Benz C220 Elegance, 4 dörrar, 88.000 km. skinn, klima/automatic, cruise, el.spegel/fönster, alu.fälgar, c.lås, airbag, antispinn, ABS, ute temp, radio, s/v-hjul, servo, creme skinn. automat. Pris 209.000 kr,-. </adtext> 
     <addate>20020118</addate> 
     <volume>0</volume> 
     <category>4 dörrar</category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Audi</name> 
     <model>S8</model> 
     <regyear>2000</regyear> 
     <price>850000</price> 
     <adtext>2000 Audi S8, 4 dörrar, 40.000 km. 4x4, Tiptronic-aut., klimataut., ABS, el.fönster/speglar/säten, soltak, c.lås, servo, airbag, startspärr, antispinn, cruise., alu., träinred., sort skinn, mitttarmstöd., sportssäten, stereo, alarm, s/v-hjul, dragkrok, 17"+18"alu. Pris 850.000 kr,-. </adtext> 
     <addate>20020118</addate> 
     <volume>0</volume> 
     <category>4 dörrar</category> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>Yamaha</name> 
     <model>Thunderace 1000</model> 
     <regyear>2000</regyear> 
     <price>130000</price> 
     <adtext>2000 Yamaha Thunderace 1000, 11.500 km. Röd/Silver,tankväska medföljer. 146hk Pris kan diskuteras vid snabb affär. Pris 130.000 kr,-. </adtext> 
     <addate>20020116</addate> 
     <volume>1000</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Audi</name> 
     <model>A4 1.6</model> 
     <regyear>2000</regyear> 
     <price>260000</price> 
     <adtext>2000 Audi A4 1.6, 4 dörrar, 78.000 km. el.fönster, ABS, alu. airbag, , klima, ESP, navig. plus, TV, evt. inbyte, power box (+30 HK) medföljer. Pris 260.000 kr,-. </adtext> 
     <addate>20020117</addate> 
     <volume>0</volume> 
     <category>4 dörrar</category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Jeep</name> 
     <model>Grand Cherokee 2.5TD</model> 
     <regyear>0</regyear> 
     <price>359000</price> 
     <adtext>0 Jeep Grand Cherokee 2.5TD, Stv., 38.000 km. A/C, el.fönster/spegel, 8xalu., c.lås, airbag, R/CD, s/v-hjul, servo. Pris 359.000 kr,-. </adtext> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>Suzuki</name> 
     <model>TL 1000 R</model> 
     <regyear>1998</regyear> 
     <price>110000</price> 
     <adtext>1998 Suzuki TL 1000 R, 8400 km. Pris 110.000 kr,-. </adtext> 
     <addate>20020116</addate> 
     <volume>1000</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Volkswagen</name> 
     <model>Golf 1.8 Pink Floyd</model> 
     <regyear>1994</regyear> 
     <price>85000</price> 
     <adtext>1994 Volkswagen Golf 1.8 Pink Floyd, 4 dörrar, 135.600 km. Eu-godkänd, airbag, el.taklucka, just ratt, metallic, radio/CD/Kass, s/v-hjul, servicebok, servo, stereo. Fullständig service, 1 ägare, 6 högtalare. Pris 85.000 kr,-. </adtext> 
     <addate>20020115</addate> 
     <volume>0</volume> 
     <category>4 dörrar</category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Volvo</name> 
     <model>850 2.0 LT</model> 
     <regyear>1997</regyear> 
     <price>245490</price> 
     <adtext>1997 Volvo 850 2.0 LT, Stv., 122785 km. halvskinn, el.spegel/fönster/soltak, fj.c.lås, st.spärr, airbag, just.ratt, rails, nedf.baksäte, m.armstöd, ABS, rad/kass, alarm, dragkrok, s/v-hjul, f.glass, met, garanti, servo. Pris 245.490 kr,-. </adtext> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Audi</name> 
     <model>A3 1.6 Ambition</model> 
     <regyear>1998</regyear> 
     <price>180000</price> 
     <adtext>1998 Audi A3 1.6 Ambition, 3 dörrar, 88.000 km. s/v-hj. el.fönster, ABS, f.glass, alu. c.lås, servo, airbag, rökfri, stilig bil. Pris 180.000 kr,-. </adtext> 
     <addate>20020117</addate> 
     <volume>0</volume> 
     <category>3 dörrar</category> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>BMW</name> 
     <model>K 1200 RS</model> 
     <regyear>2000</regyear> 
     <price>195000</price> 
     <adtext>2000 BMW K 1200 RS, 4.000 km. sidoväskor, bagagefästen. Pris 195.000 kr,-. </adtext> 
     <addate>20020116</addate> 
     <volume>1200</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Suzuki</name> 
     <model>Baleno 1.6 GLX</model> 
     <regyear>1999</regyear> 
     <price>175000</price> 
     <adtext>1999 Suzuki Baleno 1.6 GLX, Stv., 49.500 km. A/C, el.fönster/speil, c.lås, airbag, rails, ABS, stereo, , servo. Pris 175.000 kr,-. </adtext> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>Suzuki</name> 
     <model>LS 650 Savage</model> 
     <regyear>1987</regyear> 
     <price>29000</price> 
     <adtext>1987 Suzuki LS 650 Savage, röd. Pris 29.000 kr,-. </adtext> 
     <addate>20020116</addate> 
     <volume>650</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>Suzuki</name> 
     <model>GS 500 E</model> 
     <regyear>1993</regyear> 
     <price>31900</price> 
     <adtext>1993 Suzuki GS 500 E. Pris 31.900,-. </adtext> 
     <addate>20020117</addate> 
     <volume>500</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>BMW</name> 
     <model>520 i</model> 
     <regyear>2000</regyear> 
     <price>387000</price> 
     <adtext>2000 BMW 520 i, Stv., 52.600 km. Skinn, klima, m.f.ratt, el.spegel/fönster, alu.fälgar, c.lås, airbag x 6, antispinn, rails, träint, ABS, rad/cd, alarm, dragkrok, met, servo, Pris 387.000 kr,-. </adtext> 
    </ad> 
    <ad> 
     <type>1</type> 
     <name>Triumph</name> 
     <model>Daytona T 595</model> 
     <regyear>1997</regyear> 
     <price>115000</price> 
     <adtext>1997 Triumph Daytona T 595, 13.000 km. Är som ny, karbon anlägg, nya däck, extra tank. Pris 115.000 kr,-. </adtext> 
     <addate>20020115</addate> 
     <volume>955</volume> 
     <category></category> 
    </ad> 
    <ad> 
     <type>2</type> 
     <name>Mitsubishi</name> 
     <model>Pajero 2.5 TD</model> 
     <regyear>1987</regyear> 
     <price>59000</price> 
     <adtext>1987 Mitsubishi Pajero 2.5 TD, Stv. 4x4, dragkrok, servo, mycket utr., ingen rost. Pris 59.000 kr,-. </adtext> 
    </ad> 
</autoads> 

Was ich versuche, das Gleiche zu tun, ist tatsächlich tun, wie ich mit <xsl:for-each select="autoads/ad"> tun

Nur nicht die tatsächliche For-Each.

Ich habe versucht, die „Spiel“ -Funktion und Vorlage zu verwenden und dann „apply-templates“ verwenden, aber ich kann es auch die Arbeit so, dass die Werte als das erste Beispiel am Ende tatsächlich in Box:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Cars</h2> 
    <xsl:apply-templates select="//ad" /> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Name</th> 
     <th>Model</th> 
     <th>regyear</th> 
     <th>price</th> 
     <th>Description</th> 
     </tr> 
     </table> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="ad"> 
     <td><xsl:value-of select="name" /></td> 
     <!-- <td><xsl:apply-templates select="autoads/ad/model"/></td> --> 
      <!-- <td><xsl:apply-templates select="autoads/ad/regyear"/></td> --> 
     <!-- <td><xsl:apply-templates select="autoads/ad/price"/></td> --> 
      <!-- <td><xsl:apply-templates select="autoads/ad/adtext"/></td>  --> 
     </xsl:template> 
<!-- </table> --> 

</xsl:stylesheet> 

Jeder hat gute Tipps, wie man denkt?

+0

Es ist sicherlich eine gute Idee, zu lernen, wie xsl zu verwenden: apply-templates als Alternative zu xsl: for-each, beca Verwenden Sie Vorlagenregeln sind ein wesentliches Werkzeug für XSLT-Programmierer. Aber es ist auch wichtig zu erfahren, warum verschiedene Konstrukte manchmal besser geeignet sind. Der Hauptvorteil der Verwendung von xsl: apply-templates besteht darin, dass es dazu beitragen kann, dass Ihr Code widerstandsfähiger gegenüber Variationen in der Struktur des Eingabedokuments wird. Ist das eines Ihrer Ziele? –

+0

Korrigieren @Michael, etwas, es ist schwer zu wissen, wann und was/warum die verschiedenen Methoden verwenden. –

+0

Als jemand, der sich ein tieferes Verständnis der Sprache aneignen will, bist du ein Teil der Zielgruppe für mein XSLT 2.0-Buch, das dieser Frage viel Raum gibt. –

Antwort

0

ein paar Tipps:

-first wird adviced xsl Version 2 (im Jahr 2007 veröffentlicht: P) verwenden

-zweiten, apply-Vorlage als for-each effizienter ist und es ist speziell für die Dinge, die Sie erreichen wollen, konzipiert. Also hier ist, wie ich in Ihrem Code anwenden-Vorlage verwenden würde:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <h2>Cars</h2> 
      <table border="1"> 
       <tr bgcolor="#9acd32"> 
        <th>Name</th> 
        <th>Model</th> 
        <th>regyear</th> 
        <th>price</th> 
        <th>Description</th> 
       </tr> 
       <xsl:apply-templates select="/autoads/ad"/> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="/autoads/ad"> 
    <xsl:if test="type = 2"> 
     <tr> 
      <td><xsl:value-of select="name"/></td> 
      <td><xsl:value-of select="model"/></td> 
      <td><xsl:value-of select="regyear"/></td> 
      <td><xsl:value-of select="price"/></td> 
      <td><xsl:value-of select="adtext"/></td>  
     </tr> 
    </xsl:if> 
</xsl:template> 

+0

"* apply-template ist effizienter als for-each *" Nein, ist es nicht. –

+0

Die Lösung, die Sie zur Verfügung gestellt haben, funktioniert wirklich gut, aber ich bin ein wenig verwirrt in Bezug auf "Anwendung-Vorlage ist effizienter als für-jedes". Ich sehe, dass der obige Kommentator auch darauf Bezug genommen hat. Die meisten, die ich tatsächlich gesehen habe, ist die For-Each-Methode, aber wenn du eine dediziertere Antwort liefern könntest, könntest du vielleicht meine Wege ändern. –

0

Es ist nichts falsch mit xsl:for-each verwenden - aber wenn Sie mit xsl:apply-templates bevorzugen, können Sie tun:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/autoads"> 
    <html> 
     <body> 
      <h2>Cars</h2> 
      <table border="1"> 
       <tr> 
        <th>Name</th> 
        <th>Model</th> 
        <th>regyear</th> 
        <th>price</th> 
        <th>Description</th> 
       </tr> 
       <xsl:apply-templates select="ad[type=2]"/> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="ad"> 
    <tr> 
     <td> 
      <xsl:value-of select="name"/> 
     </td> 
     <td> 
      <xsl:value-of select="model"/> 
     </td> 
     <td> 
      <xsl:value-of select="regyear"/> 
     </td> 
     <td> 
      <xsl:value-of select="price"/> 
     </td>  
     <td> 
      <xsl:value-of select="adtext"/> 
     </td>  
    </tr> 
</xsl:template> 

</xsl:stylesheet>