2014-01-19 75 views
1

我有一個xml,我想將其轉換爲另一個xml。尋找2天,並沒有找到我的案例的任何好例子; 2節點汽車距離使用xsl進行XML轉換 - 對於每個

對於每個id_car,我必須對距離進行分組(參見下面的輸出xml)。

來源:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<output> 
    <cars> 
     <car> 
      <id>1</id> 
      <brand>Audi</brand> 
      <type>A4_Quattro</type> 
      <license>TEST</license> 
     </car> 
     <car> 
      <id>2</id> 
      <brand>FORD</brand> 
      <type>XLT_Ranger</type> 
      <license>PROTOTYPE</license> 
     </car> 
    </cars> 
    <distances> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110901</date> 
      <distance>123</distance> 
     </distance> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110902</date> 
      <distance>194</distance> 
     </distance> 
     <distance> 
      <id_car>2</id_car> 
      <date>20110907</date> 
      <distance>24</distance> 
     </distance> 
     <distance> 
      <id_car>2</id_car> 
      <date>20110915</date> 
      <distance>105</distance> 
     </distance> 
    </distances> 
</output> 

輸出XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<output> 
    <cars> 
     <car> 
      <id>1</id> 
      <brand>Audi</brand> 
      <type>A4_Quattro</type> 
      <distances> 
         <distance day="20110901">123</distance> 
         <distance day="20110902">194</distance> 
      </distances> 
     </car> 
     <car> 
      <id>2</id> 
      <brand>FORD</brand> 
      <type>XLT_Ranger</type> 
      <license>PROTOTYPE</license> 
      <distances> 
         <distance day="20110907">24</distance> 
         <distance day="20110915">105</distance> 
      </distances> 
     </car> 
    </cars> 
<output> 

這是幾十個嘗試的結果是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:key name="Dist_car" match="distances/distance" use="id_car" /> 
<xsl:template match="@*|node()"> 
<xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <distances> 
     <xsl:apply-templates select="key('Dist_car', id)"/> 
     </distances> 
</xsl:copy> 
</xsl:template> 
     <xsl:template match="distance"> 
     <distance day="{date}"><xsl:value-of select="distance"/></distance> 
</xsl:template> 
</xsl:stylesheet> 

如果任何人有任何的想法是值得歡迎...非常感謝!

P.S. :我用這個測試xsl http://xslttest.appspot.com/

回答

4

您的模板匹配過於廣泛,因此它會生成太多的<distances>元素,並且它還會複製原始距離。

儘量縮小匹配規則。您也可以使用xsl:copy-of複製源文檔的各個部分。

我得到你想要的輸出,如果我改變你的樣式有點:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:key name="Dist_car" match="distances/distance" use="id_car" /> 
    <xsl:template match="/"> 
     <output> 
      <cars> 
       <xsl:apply-templates select="output/cars" /> 
      </cars> 
     </output> 
    </xsl:template> 
    <xsl:template match="car"> 
     <xsl:copy> 
      <xsl:copy-of select="@*|node()" /> 
      <distances> 
       <xsl:apply-templates select="key('Dist_car', id)" /> 
      </distances> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="distance"> 
     <distance day="{date}"> 
      <xsl:value-of select="distance" /> 
     </distance> 
    </xsl:template> 
</xsl:stylesheet> 
+0

上帝,這是美好的!呃...非常感謝!最好的祝願! –

+0

我另一個好奇心:我想計算,對於每一個id_car總距離....然後平均距離:總和(距離)/ NUM ber_of_days ...第一輸出:「 奧迪 A4_Quattro 「認爲你能幫助我嗎? :) –

+0

xpath有一個sum()函數,可以用來總結距離,還有一個count()函數,可以用來計算天數。 xpath中的分區是用'div'運算符而不是斜槓字符編寫的。所以爲了得到你想要的結果,在樣式表中的''元素中加入:'< xsl:value-of select =「sum(key('Dist_car',id)/ distance)div count(key('Dist_car',id)/ distance)」/>' –