XSLT 中的过滤器和分组

Filter and Group in XSLT

我正在尝试过滤数据,然后使用 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 方法,但我找不到过滤它的方法。 如果有人能给我一些指点,那将是一个很大的帮助

谢谢

在 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>

没有明确的 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>