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

我尝试使用分组方法,但我想不出过滤它的方法。如果有人能给我一些指示,那将是一个很大的帮助

谢谢

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

相关内容

  • 没有找到相关文章

最新更新