2015-03-30 28 views
1

我想篩選數據,然後使用XSLT進行分組。這裏是我的XMLXSLT中的篩選器和組

<?xml version="1.0" encoding="UTF-8"?> 
<AccumulatedOutput> 
    <root> 
     <Header> 
      <Add>true</Add> 
      <Name>Subscriber</Name> 
      <Value>SAC</Value> 
     </Header> 
    </root> 
    <root> 
     <Header> 
      <Add>true</Add> 
      <Name>System</Name> 
      <Value>CBP</Value> 
     </Header> 
    </root> 
    <root> 
     <Header> 
      <Add>false</Add> 
      <Name>Subscriber</Name> 
      <Value>SAC</Value> 
     </Header> 
    </root> 
</AccumulatedOutput> 

我想要做的是,基於Header/Name和組,但除去其中Header/Add是假的組。 所以在上面的例子中,我會創建兩個組(一個用於Name=Subscriber和其他用於Name=System),但由於第一組(包含Name=Subscriber)包含Add=false,所以我想忽略它,並且我的輸出應該只有一個節點,比如低於

<?xml version = "1.0" encoding = "UTF-8"?> 
<root> 
    <Header> 
     <Name>System</Name> 
     <Value>CBP</Value> 
     <Add>true</Add> 
    </Header> 
</root> 

我嘗試使用group by方法,但我無法找出一種方法來過濾它。 這將是一個很大的幫助,如果有人可以給我一些指點

感謝

+0

請選擇XSLT 1.0或2.0,而不是兩者。 – 2015-03-30 19:52:10

+0

我不介意使用它們中的任何一個來解決這個問題,因此使用了 – Kapil 2015-03-30 19:53:38

+0

你想對包含多個項目的組做什麼?你想要以某種方式合併它們,還是隻輸出所有項目? – 2015-03-30 19:58:08

回答

3

在XSLT 2.0,你可以這樣做:

<xsl:template match="/AccumulatedOutput"> 
    <root> 
     <xsl:for-each-group select="root/Header" group-by="Name"> 
      <xsl:if test="not(current-group()/Add='false')"> 
       <xsl:copy-of select="current-group()"/> 
      </xsl:if> 
     </xsl:for-each-group> 
    </root> 
</xsl:template> 
1

沒有明確的XSLT條件指令

<xsl:template match="/*"> 
    <root> 
     <xsl:for-each-group group-by="Name" select= 
     "root/Header[for $n in string(Name) 
         return every $h in /*/root/Header[Name eq $n] 
            satisfies not($h/Add eq 'false')]"> 
       <xsl:sequence select="current-group()"/> 
     </xsl:for-each-group> 
    </root> 
</xsl:template>