我正在尝试过滤数据,然后使用 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>