2015-01-14 42 views
2

我有一個XMl文件,我需要提取出一些信息並總結值。 在XSL文件中我不確定是否需要for-each循環。 我認爲XSL將解釋我想要做的事情。XSL合計值

這裏的XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="uppgift3.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.fte, 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?rrrar</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., trnred., 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?mster/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闁剁€岆 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, rostfri, 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, bagageften. 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, trnt, 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. 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文件:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>Fordon till salu</h2> 
       <div> 
        <xsl:for-each select="autoads/ad"> 
        <xsl:sort select="regyear" order="ascending" /> 
         <div style="margin:15px;"> 
          <xsl:choose> 
           <xsl:when test="regyear &lt; 1999"> 
            <span style="margin-right:10px;font-weight:bold;float:left;">Total amount of cars before 1999: </span> 
            <div><xsl:value-of select="sum(//name)" /></div> 

            <span style="margin-right:5px;font-weight:bold;float:left;">Total amount of cars with automatic gear: </span> 
            <div><xsl:value-of select="model" /></div> 

            <span style="margin-right:5px;font-weight:bold;float:left;">Average price for cars before 1999: </span> 
            <div><xsl:value-of select="sum(//price[regyear &lt; 1999])" /></div> 
           </xsl:when> 
           <xsl:otherwise> 
            <span style="margin-right:10px;font-weight:bold;float:left;">Total amount of cars from 1999 and onwards: </span> 
            <div><xsl:value-of select="name" /></div> 

            <span style="margin-right:5px;font-weight:bold;float:left;">Total amount of cars with automatic gear: </span> 
            <div><xsl:value-of select="model" /></div> 

            <span style="margin-right:5px;font-weight:bold;float:left;">Average price for cars from 1999 and onwards: </span> 
            <div><xsl:value-of select="regyear" /></div> 
           </xsl:otherwise> 
          </xsl:choose> 
         </div> 
        </xsl:for-each> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

我已經編輯我的答案,顯示預期的結果。感謝輸入的人。 因此具有XML文件和XSL文件我想要得到的結果是:

Total amount of cars before 1999: 
Total amount of cars with automatic gear: 
Average price for cars before 1999: 

Total amount of cars from 1999 and onwards: 
Total amount of cars with automatic gear: 
Average price for cars from 1999 and onwards: 

上述結果還沒有計算。 Tnx再次!

我試圖從XML文件中提供的文本中提取信息。
這就是我試圖提取在adtext中有「automat」工作的汽車的數量。
結果應該是1 < 1999年1> = 1999

<h2 style="margin:0">Antal bilar med automat v&#228;xell&#229;da: <xsl:value-of select="count(/autoads/ad[regyear &lt; 1999][type = 2]/adtext[contains(., 'automat')])" /></h2> 
+2

你可以作爲您試圖總結(或計數)什麼更精確?如果你顯示了你的期望輸出和你當前得到的輸出(或者如果你有錯誤,我懷疑可能會發生......),這將有所幫助。謝謝! –

+1

「我認爲XSL會解釋」你不應該在StackOverflow上使用這樣的假設。我們重視質量問題和答案,所以請儘可能清楚,而不要依靠您的代碼來解釋所有問題。 就像@Tim解釋的那樣,當處理XSLT(或者正則表達式)時,我們期待輸入,XSL,輸出(或錯誤)和期望的輸出。 – Kilazur

+0

在上面編輯我的問題。 thnx爲輸入的傢伙! – Grendizer

回答

2

我懷疑你實際上得到一個錯誤,因爲該行

<xsl:value-of select="sum(//name)" /> 

name包含字符串的,不是一個數字,添加你不能加起來的話!

如果您只需要總值(如總和或計數),則不需要xsl:for-each,否則您將獲得每個汽車在XML中的總計。

得到總的汽車在1999年之前,例如,你只需要使用count功能,任何循環

<xsl:value-of select="count(ad[regyear &lt; 1999])" /> 

之外(這是假設您目前位於autoads元素,順便說一句。)

要使用自動排擋獲得1999年之前的汽車數量,你可以這樣做(假設2 type是自動的....)

<xsl:value-of select="count(ad[regyear &lt; 1999][type = 2])" /> 

而獲得的平均價格,你會做這個....

<xsl:value-of select="sum(ad[regyear &lt; 1999]/price) div count(ad[regyear &lt; 1999])" /> 

當然,如果你想要做汽車同樣從1999年開始,這將是類似的,但你最終會有很多代碼重複。所以你可以使用一個已命名的模板來完成總數,然後傳入你希望算作參數的汽車。

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" /> 
    <xsl:template match="/autoads"> 
     <html> 
      <body> 
       <h2>Fordon till salu</h2> 
       <xsl:call-template name="totals"> 
        <xsl:with-param name="ads" select="ad[regyear &lt; 1999]" /> 
       </xsl:call-template> 
       <xsl:call-template name="totals"> 
        <xsl:with-param name="ads" select="ad[regyear >= 1999]" /> 
       </xsl:call-template> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template name="totals"> 
     <xsl:param name="ads" /> 

     <div style="margin:15px;"> 
      <span style="margin-right:10px;font-weight:bold;float:left;">Total amount of cars before 1999: </span> 
      <div><xsl:value-of select="count($ads)" /></div> 

      <span style="margin-right:5px;font-weight:bold;float:left;">Total amount of cars with automatic gear: </span> 
      <div><xsl:value-of select="count($ads[type = 2])" /></div> 

      <span style="margin-right:5px;font-weight:bold;float:left;">Average price for cars before 1999: </span> 
      <div><xsl:value-of select="sum($ads/price) div count($ads)" /></div> 
     </div> 
    </xsl:template> 
</xsl:stylesheet> 
+0

非常感謝Tim C.我會嘗試你的建議,然後接受它作爲答案! – Grendizer

+0

在上面添加了一個以上的問題:) – Grendizer

+0

你真的應該問一個全新的問題,而不是在提出問題並回答之後修改原始問題。謝謝! –