XSLT的for-each使用[position()=1]仍返回多个匹配值如何解决
问题原因
你遇到的问题是XPath表达式的优先级规则导致的。你当前写的//*[@key='xbrl:concept'][. = 'se:Bank'][position() = 1]中,[position() = 1]的作用范围是「每个父节点下的匹配子节点」,而不是「全局所有匹配节点的集合」。你提供的JSON里有两个独立的facts对象都包含xbrl:concept": "se:Bank",这两个节点在各自的父节点下的位置都满足position()=1的条件,所以会匹配到两个节点,最终输出两次heading值。
解决方法
这个问题只需要调整for-each的select表达式即可,不需要更换其他XSLT元素。你只需要把前面的节点筛选逻辑用括号包裹,再取第一个位置的节点即可,修改后的select表达式如下:
(//*[@key='xbrl:concept'][. = 'se:Bank'])[position() = 1]
也可以简化写为:
(//*[@key='xbrl:concept'][. = 'se:Bank'])[1]
如果你的场景只需要提取单个值,甚至可以省略xsl:for-each元素,直接用xsl:value-of取值即可,对应模板可以简化为:
<xsl:template match="//*[@key='facts']"> <xsl:value-of select="(//*[@key='xbrl:concept'][. = 'se:Bank'])[1]/../*[@key='heading']"/> </xsl:template>
修改后就只会输出一次Bank balance,符合你的预期。
内容的提问来源于stack exchange,提问作者Toolbox
相关产品推荐
相关产品推荐

