在 for-each 期间控制开始和停止位置

Control start and stop position during a for-each

我正在寻找一种方法来控制作为后缀数字添加到文本“句点”的开始和结束编号。似乎我的代码逻辑使 for-each 计数 3 个搜索匹配项(索引 1-3),并且由于使用 if 查找 se:Bank 它将打印输出减少到 2 个打印。

我知道我可以使用 position() -2 强制编号从 0 开始,但这只有在我有完全相同数量的数据时才有效。一旦数据增长,position() -2 将假设第 2 步位置减去并且不会 return 零作为开始。

我确实理解 XSLT 会做我实际要求的事情并且 return 可能是正确的答案。

我将使用的数字间隔在 0 到 3 之间。大部分时间是按顺序排列的。 事先不知道确切的间隔金额。

我知道有一个 start-at 使用 <xsl:number> 但它没有解决我的问题。使用 start-at 打印出相同的数字两次。

JSON 文件符合特定标准,因此不允许我更改 JSON 文件的结构。

疑似问题:

“foreach”跨越的循环比预期的要多。在这种情况下,我只需要让系统为“se:Bank”循环两次,因此 return“period0”和“period1”。

观察:

我怀疑我在xbrl:concept = se:Bank时学习提取可能会更好。这会将计划的循环减少到 2 次搜索,从而能够迭代它们。

在这里您可以找到 xsltfiddle

您在下面找到与 xsltfiddle 中相同的代码:

JSON数据:

<data>
{
  "report": {
    "facts": [
      {
        "xbrl:concept": "se:CompanyName",
        "value": "Great Company Ltd"
      },
      {
        "xbrl:concept": "se:Bank",
        "numericValue": 1000
      },
      {
        "xbrl:concept": "se:Bank",
        "numericValue": 3000
      }
    ]
  }
}
</data>

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']">
        
        <xsl:for-each select="//*[@key='xbrl:concept']">
            <xsl:if test=". = 'se:Bank'">
            
            period<xsl:number value="position()"/>
            </xsl:if>
        </xsl:for-each>
        
    </xsl:template>
  
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>period2period3

预期结果:

<?xml version="1.0" encoding="UTF-8"?>period0period1

如果要输出position()或者position() - 1那么分别输出<xsl:value-of select="position()"/>或者<xsl:value-of select="position() -1 "/>就可以了,不需要再输出position()xsl:number.

此外,我不确定我是否正确理解了您的要求,但是使用谓词 <xsl:for-each select=".//*[@key='xbrl:concept'][. = 'se:Bank']"> 而不是嵌套 xsl:if 应该有助于获得您想要的结果,即处理输入样本中的两个元素满足谓词中的条件:https://xsltfiddle.liberty-development.net/93wniUS/1