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