2017-02-20 34 views
0

Я недавно столкнулся с небольшим вызовом, хотя считаю, что многие люди просто придерживаются цикла -ForEach, как мы обычно делаем, я пытаюсь думать снаружи и посмотреть, какие альтернативные пути мы имеем на самом деле к одному и тому же, но по-другому.Разный способ для XSLT прокручивать узлы

Существует еще один способ на самом деле пропустить дочерние узлы в этом XSLT, но мне немного сложно найти его. Я искал форум без ответа, но, возможно, кто-то может указать мне в правильном направлении.

Мои коды выглядит следующим образом: атм

<?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> 

и XML выглядит следующим образом:

<?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> 

То, что я пытаюсь сделать, это на самом деле сделать то же самое, как и я с <xsl:for-each select="autoads/ad">

Просто не используйте фактически для каждого.

Я пытался использовать функцию «соответствие» и шаблон, а затем с помощью «применить-шаблоны», но я не могу получить его тоже работают так, что значения на самом деле в конечном итоге в коробках, как и в первом примере:

<?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> 

У кого-нибудь есть хорошие советы о том, как думать?

+0

Это, конечно, хорошая идея, чтобы узнать, как использовать XSL: Наносить-шаблоны в качестве альтернативы XSL: для-каждого, Бека использование шаблонных правил является важным инструментом для программистов XSLT. Но важно также узнать, почему иногда разные конструкции. Основное преимущество использования xsl: apply-templates заключается в том, что оно может помочь сделать ваш код более устойчивым к изменениям структуры входного документа. Это одна из ваших целей? –

+0

Правильно @Michael, что-то трудно понять, когда и что/зачем использовать разные методы. –

+0

Как человек, который хочет получить более глубокое понимание языка, вы в значительной степени являетесь частью целевой аудитории моей книги XSLT 2.0, которая посвящает много места этому вопросу. –

ответ

0

пару советов:

-первая, он посоветовал использовать XSL версии 2 (выпущенный в 2007 году: P)

-Второй, применить-шаблон является более эффективным, чем, каждый, и это разработан специально для того, что вы хотите достичь. Так вот, как я хотел бы использовать применить-шаблон в коде:

<?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 более эффективен, чем для каждого *" Нет, это не так. –

+0

Решение, которое вы предоставили, работает очень хорошо, но я немного смущен относительно того, что «apply-template более эффективен, чем для каждого». Я вижу, что вышеупомянутый комментатор также ссылался на это. В основном я видел только для каждого метода, но если бы вы могли предоставить более выделенный ответ, возможно, вы могли бы изменить мои способы. –

0

Там нет ничего плохого в использовании xsl:for-each - но если вы предпочитаете использовать xsl:apply-templates, вы можете сделать:

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> 

 Смежные вопросы

  • Нет связанных вопросов^_^