2014-06-26 88 views
-2

我有這樣的.xml總結相關的值

<?xml version="1.0" encoding="ISO-8859-1"?> 
<output> 
    <orders> 
     <order> 
      <id>1</id> 
      <number>10002</number> 
      <type>Loading</type> 
      <date>2013-01-01T02:30:00</date> 
     </order> 
     <order> 
      <id>2</id> 
      <number>10003</number> 
      <type>Loading</type> 
      <date>2013-01-01T010:30:00</date> 
     </order> 
     <order> 
      <id>3</id> 
      <number>10004</number> 
      <type>Loaded</type> 
      <date>2013-01-01T12:30:00</date> 
     </order> 
    </orders> 
    <quantities> 
     <quantity> 
      <id_order>1</id_order> 
      <unit>KG</unit> 
      <value>1000</value> 
     </quantity> 
     <quantity> 
      <id_order>1</id_order> 
      <unit>PAL</unit> 
      <value>3</value> 
     </quantity> 
     <quantity> 
      <id_order>1</id_order> 
      <unit>M3</unit> 
      <value>1.5</value> 
     </quantity> 
     <quantity> 
      <id_order>2</id_order> 
      <unit>KG</unit> 
      <value>2000</value> 
     </quantity> 
     <quantity> 
      <id_order>2</id_order> 
      <unit>PAL</unit> 
      <value>4</value> 
     </quantity> 
     <quantity> 
      <id_order>3</id_order> 
      <unit>KG</unit> 
      <value>5000</value> 
     </quantity> 
    </quantities> 
</output> 

和期望轉化爲類似

<output> 
    <amount>KG</amount> 
     <total> "sum of all KG elements" </total> 
    <amount>PAL</amount> 
     <total> "sum of all PAL elements" </total> 
    <amount>M3</amount> 
     <total> "sum of all M3 elements" </total> 
</output> 

我已經試過類似

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 


<xsl:template match="/"> 
<output> 
     <xsl:for-each select="output/quantities/quantity"> 
      <amount> 
       <xsl:value-of select="unit"/> 

       <xsl:for-each select="output/quantities/quantity/value"> 
         <xsl:value-of select="sum(output/quantities/quantity/value)"/> 

       </xsl:for-each> 
      </amount>  
     </xsl:for-each> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

但我不得到值的總和,並且輸出如此破碎

<output> 
    <amount>KG<total/></amount> 
    <amount>PAL<total/></amount> 
    <amount>M3<total/></amount> 
    <amount>KG<total/></amount> 
    <amount>PAL<total/></amount> 
    <amount>KG<total/></amount> 
</output> 

我已經嘗試了幾個其他的解決方法,但沒有工作到我想要的輸出。如果有人能以任何方式建議任何事情或提供幫助,我將不勝感激。

現在我試圖添加另一個節點,在第一個xml中調用之後,應該基本上具有複製值的值,剝離後僅在小時後顯示(hh:mm:ss)。我已經設法創建了原始xml的副本並添加了額外的標籤,但我不確定如何提取小時數據並在內部標籤中顯示。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 


    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="date"> 
     <xsl:copy-of select="."/> 
     <hour> 
<xsl:comment> <xsl:copy-of select="substring(output/orders/order/date,11)"/> </xsl:comment> 
     </hour> 
    </xsl:template> 

</xsl:stylesheet> 
+1

我已將您的標題更改爲更具描述性的標題。實際上所有的XSLT問題都是關於「xslt transform xml to xml」 - 請儘量多表達一點。 –

+0

謝謝,我設法使它與你的代碼一起工作,並進一步推導它以滿足我的需求。我感謝您的幫助。我更新了我的下一個問題,我無法將一個標記值複製到另一個創建的標記中。 – user2842773

+0

我建議你用新問題發佈一個新問題,因爲它們似乎沒有關係。 –

回答

2

試試這樣說:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="qty" match="quantity" use="unit"/> 

<xsl:template match="/"> 
    <output> 
     <amount>KG</amount> 
     <total><xsl:value-of select="sum(key('qty', 'KG')/value)"/></total> 
     <amount>PAL</amount> 
     <total><xsl:value-of select="sum(key('qty', 'PAL')/value)"/></total> 
     <amount>M3</amount> 
     <total><xsl:value-of select="sum(key('qty', 'M3')/value)"/></total> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

請注意,這不是你能選擇最佳的輸出格式;理想情況下,單位和金額將包含在一個共同的元素中,而不僅僅是相鄰的兄弟姐妹。