在XSLT中过滤和分组

时间:2015-03-30 19:09:41

标签: xslt xslt-1.0 xslt-2.0 xpath-2.0 xslt-grouping

我正在尝试过滤数据,然后使用XSLT进行分组。这是我的XML

    <?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方法,但我无法找到过滤它的方法。 如果有人能给我一些指示,这将是一个很大的帮助

谢谢

2 个答案:

答案 0 :(得分: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 :(得分: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>