XSLT 2.0统计满足条件的指定XML元素值重复次数方法
问题原因
你写的count(Loop-HL/Segment-SLN[Element-235_8='IK']/Element-234_8)返回15是必然的:这个语句统计的是所有Element-235_8等于IK的Segment-SLN下的Element-234_8节点总数,你贴的样例里一共5个Loop-HL,每个下面刚好3个满足Element-235_8='IK'的Segment-SLN,3乘5正好15,你压根没加「Element-234_8等于指定目标值」的过滤条件,当然拿不到你要的单值计数结果。
XSLT 2.0 正确写法
如果只需要统计某一个指定Element-234_8值的出现次数,不需要额外特殊函数,直接在筛选谓词里补全值匹配条件就行,正确XPath如下:
count(//Loop-HL/Segment-SLN[Element-235_8='IK' and Element-234_8='你要统计的目标值'])
拿你举的例子来说,把目标值换成400200167700010191932355211,这个语句就会正确返回5。
如果需要批量统计所有符合条件的Element-234_8值各自的出现次数,搭配以下XSLT 2.0特性/函数即可:
distinct-values():用来提取所有满足Element-235_8='IK'的Element-234_8去重值列表,避免重复统计- 配合
for-each遍历去重后的值,逐个计数即可,参考代码:
<!-- 定义变量存储所有符合条件的去重值 --> <xsl:variable name="validCodes" select="distinct-values(//Loop-HL/Segment-SLN[Element-235_8='IK']/Element-234_8)"/> <!-- 遍历每个编码统计出现次数 --> <xsl:for-each select="$validCodes"> <item> <code><xsl:value-of select="."/></code> <count><xsl:value-of select="count(//Loop-HL/Segment-SLN[Element-235_8='IK' and Element-234_8=current()])"/></count> </item> </xsl:for-each>
注意:如果执行XPath时的当前上下文不是XML根节点,把路径开头的
//替换成你实际的根节点绝对路径,避免匹配出错。
内容的提问来源于stack exchange,提问作者HKmar
相关产品推荐
相关产品推荐

