2015-05-15 70 views
1

我是XSLT的新手,並且必須對一個元素進行分組/總和,因爲單個員工可能有兩行數據。我能夠使用tag和sum(current-group())函數來實現該功能。輸入xml具有屬性,並且與之前的需要一起還必須在結果輸出xml中重現xml屬性。使用XSLT 2.0重新生成屬性使用XSLT 2.0和分組一個元素

**Sample XML:** 
<ws:Review> 
    <ws:Employee> 
    <ws:EmpID>12345</ws:EmpID> 
    <ws:Amount>4</ws:Amount> 
    <ws:Amount>5</ws:Amount> 
    <ws:Currency Descriptor="IDR"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e7</ws:ID> 
     <ws:ID ws:type="Currency_ID">IDR</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
    <ws:Employee> 
    <ws:EmpID>12345</ws:EmpID> 
    <ws:Amount>6</ws:Amount> 
    <ws:Currency Descriptor="IDR"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e7</ws:ID> 
     <ws:ID ws:type="Currency_ID">IDR</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
    <ws:Employee> 
    <ws:EmpID>23456</ws:EmpID> 
    <ws:Amount>4</ws:Amount> 
    <ws:Currency Descriptor="GBP"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e5</ws:ID> 
     <ws:ID ws:type="Currency_ID">GBP</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
    <ws:Employee> 
    <ws:EmpID>34567</ws:EmpID> 
    <ws:Amount>4</ws:Amount> 
    <ws:Amount>5</ws:Amount> 
    <ws:Currency Descriptor="USD"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f679</ws:ID> 
     <ws:ID ws:type="Currency_ID">USD</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
</ws:Review> 

預期輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ws="namespace" version="2.0"> 

<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <ws:Review> 
    <xsl:for-each-group select="ws:Review/ws:Employee" group-by="ws:Employee/ws:EmpID> 
     <ws:EmpID><xsl:value-of select="ws:Employee/ws:EmpID"/></ws:EmpID> 
     <ws:Currency><xsl:value-of select="ws:Employee/ws:Currency/@ws:Descriptor"/></ws:Currency> 
     <ws:Amount><xsl:value-of select="sum(current-group()/ws:Employee/ws:Amount)"/></ws:Amount> 
    </xsl:for-each-group> 
    </ws:Review> 
</xsl:template> 

有人可以幫我修改當前XSL使得屬性結轉:我寫

<ws:Review> 
    <ws:Employee> 
    <ws:EmpID>12345</ws:EmpID> 
    <ws:Amount>15</ws:Amount> 
    <ws:Currency Descriptor="IDR"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e7</ws:ID> 
     <ws:ID ws:type="Currency_ID">IDR</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
    <ws:Employee> 
    <ws:EmpID>23456</ws:EmpID> 
    <ws:Amount>4</ws:Amount> 
    <ws:Currency Descriptor="GBP"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e7</ws:ID> 
     <ws:ID ws:type="Currency_ID">GBP</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
    <ws:Employee> 
    <ws:EmpID>34567</ws:EmpID> 
    <ws:Amount>9</ws:Amount> 
    <ws:Currency Descriptor="USD"> 
     <ws:ID ws:type="AID">9464cef721784d6ab96eaad1b366f6e7</ws:ID> 
     <ws:ID ws:type="Currency_ID">USD</ws:ID> 
    </ws:Currency> 
    </ws:Employee> 
</ws:Review> 

XSL?我會很樂意提供任何援助。

謝謝! 維韋克

回答

0

我將推動要素的身份轉化,參見http://xsltransform.net/bdxtqy這確實

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:ws="http://example.com/"> 

    <xsl:output method="xml" indent="yes" /> 


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

    <xsl:template match="ws:Review"> 
     <xsl:copy> 
      <xsl:for-each-group select="ws:Employee" group-by="ws:EmpID"> 
       <xsl:copy> 
        <xsl:apply-templates select="ws:EmpID"/> 
        <ws:Amount><xsl:value-of select="sum(current-group()/ws:Amount)"/></ws:Amount> 
        <xsl:apply-templates select="* except (ws:EmpID, ws:Amount)"/> 
       </xsl:copy> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 
+0

馬丁,非常感謝你。工作得很好,感謝您的協助! – Vivek