在 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
我正在寻找一种方法来控制作为后缀数字添加到文本“句点”的开始和结束编号。似乎我的代码逻辑使 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