XSLT控制for-each循环起止编号 实现se:Bank匹配项从0计数
问题根源
你遇到的编号异常是因为for-each遍历的是全部3个xbrl:concept节点,position()返回的是节点在整个未过滤序列中的位置,if筛选只是跳过了不符合条件的节点,并没有改变position()的计数基准。
可行实现方案
直接将筛选逻辑放到for-each的select属性中,提前过滤出所有xbrl:concept = se:Bank的节点再遍历计数,修正后的XSL代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> <xsl:output method="xhtml" indent="yes" html-version="5"/> <xsl:mode on-no-match="shallow-skip"/> <!-- Parse JSON to XML --> <xsl:template match="data"> <xsl:apply-templates select="json-to-xml(.)/*"/> </xsl:template> <!-- Printout periods --> <xsl:template match="//*[@key='facts']"> <!-- 直接筛选符合条件的节点再遍历,此时序列长度为2 --> <xsl:for-each select="//*[@key='xbrl:concept'][. = 'se:Bank']"> period<xsl:number value="position() - 1"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
改动说明
- 调整
for-each选择器:新增筛选条件[. = 'se:Bank'],此时遍历的节点序列仅包含符合要求的se:Bank节点,position()会在这个过滤后的序列内计数 - 编号偏移调整:用
position() - 1将计数基准从1改为0,最终输出从0开始的连续编号,不受前置节点数量变化影响,适配动态数据量场景。
内容的提问来源于stack exchange,提问作者Toolbox
相关产品推荐
相关产品推荐

