2015-11-05 61 views
0

鑑於這種結構:XSLT 2.0前值中的for-each組

<ROOT> 
    <MYROW> 
     <CATEGORYNAME>first</CATEGORYNAME> 
     <DATA>10</DATA> 
    </MYROW> 
    <MYROW> 
     <CATEGORYNAME>second</CATEGORYNAME> 
     <DATA>20</DATA> 
    </MYROW> 
    <MYROW> 
     <CATEGORYNAME>second</CATEGORYNAME> 
     <DATA>30</DATA> 
    </MYROW> 
    <MYROW> 
     <CATEGORYNAME>first</CATEGORYNAME> 
     <DATA>100</DATA> 
    </MYROW> 
</ROOT> 

我做的這種轉變:

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

    <xsl:output indent="yes"/> 

    <xsl:template match="ROOT"> 
     <Worksheet> 
      <xsl:for-each-group select="MYROW" group-by="CATEGORYNAME"> 
       <ROW> 
        <CELL> 
         <DATA> 
          <xsl:value-of select="current-grouping-key()"/> 
         </DATA> 
        </CELL> 
       </ROW> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:for-each-group> 
     </Worksheet> 
    </xsl:template> 

    <xsl:template match="MYROW"> 
     <ROW> 
      <CELL> 
       <xsl:value-of select="DATA"/> 
      </CELL> 
     </ROW> 
    </xsl:template> 
</xsl:transform> 

我想比較「DATA 「與之前在團隊中的價值。我不能設法得到以前的價值。我想:

<xsl:value-of select="preceding-sibling::node()/DATA"/> 

這將前面的所有兄弟節點的原始XML,而不僅僅是在當前組。

基本上我想知道是否有一種方法可以在group-by序列中使用xpath。

預期輸出:

<Worksheet> 
    <ROW> 
     <CELL> 
     <DATA>first</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA color = "black">10</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA color = "blue">100</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA color = "red">5</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA>second</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA color = "black">20</DATA> 
     </CELL> 
    </ROW> 
    <ROW> 
     <CELL> 
     <DATA color = "blue">30</DATA> 
     </CELL> 
    </ROW> 
</Worksheet> 
+1

你可以發佈你想要達到的結果嗎?目前還不清楚您是要在原始輸入XML中將「DATA」元素與其之前的「DATA」元素進行比較還是與前一個組成員進行比較。目前還不清楚你想要比較什麼,也許你想用'DATA'嵌套分組?例如, –

+0

,對於我的第一個名爲「first」的組,我的值依次爲10和100。我想知道100是否大於它以前的值10。爲了給你更多的上下文,我的數據值是按照時間順序排列的,這就是爲什麼我想進行比較,但是在每個組中。 – PDM

+0

所以我想比較一下預先的組員。 – PDM

回答

1

假設你已經在<xsl:apply-templates select="current-group()"/>如圖所示,然後爲<xsl:template match="MYROW">的模板,那麼你可以在http://xsltransform.net/pPzifp8/1使用

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="ROOT"> 
     <Worksheet> 
      <xsl:for-each-group select="MYROW" group-by="CATEGORYNAME"> 
       <ROW> 
        <CELL> 
         <DATA> 
          <xsl:value-of select="current-grouping-key()"/> 
         </DATA> 
        </CELL> 
       </ROW> 
       <xsl:apply-templates select="current-group()"/> 
      </xsl:for-each-group> 
     </Worksheet> 
    </xsl:template> 

    <xsl:template match="MYROW"> 
     <xsl:variable name="pos" select="position()"/>                  
     <xsl:variable name="preceding-group-member" select="current-group()[$pos - 1]"/> 
     <xsl:variable name="this-data" select="xs:decimal(DATA)"/> 
     <xsl:variable name="preceding-data" select="xs:decimal($preceding-group-member/DATA)"/> 
     <ROW> 
      <CELL color="{if ($pos eq 1 or $this-data eq $preceding-data) 
         then 'black' else (if ($this-data gt $preceding-data) then 'blue' else 'red')}"> 
       <xsl:copy-of select="DATA"/> 
      </CELL> 
     </ROW> 
    </xsl:template> 
</xsl:transform> 

在線。

+0

完美的謝謝。它工作得很好 – PDM