gpt4 book ai didi

xslt - XSL条件总计

转载 作者:行者123 更新时间:2023-12-02 04:12:26 25 4
gpt4 key购买 nike

是否可以在xsl中执行条件求和?

我有以下xml示例:

<?xml version="1.0" encoding="utf-8"?>
<export>
<stats set="1">
<columns>
<column id="0">
<sum>100</sum>
</column>
<column id="1">
<sum>102</sum>
</column>
<column id="2">
<sum>12</sum>
</column>
</columns>
</stats>
<stats set="2">
<columns>
<column id="0">
<sum>100</sum>
</column>
<column id="1">
<sum>101</sum>
</column>
<column id="2">
<sum>19</sum>
</column>
</columns>
</stats>
</export>

是否可以计算每个统计信息集中彼此不相等的所有列的总数?因此它将输出以下内容:
               Set 1       Set 2       Diff(Set 1 - Set 2)
Total (Diff) 114 120 -6
column 2 102 101 1
column 3 12 19 -7

因此,在输出列1中将被省略,因为两个统计数据集中的总和是相同的。

我可以让我的xsl输出不同的列,但不确定如何将这些总和并放入总行中。

非常感谢,

安德兹

最佳答案

此转换(64行):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kColByPosAndVal" match="column"
use="concat(count(preceding-sibling::*),
'+',
sum)"/>
<xsl:key name="kIdByVal" match="column/@id"
use="."/>

<xsl:template match="/*">
<xsl:variable name="vsum1" select=
"sum(stats[@set=1]/*/column
[not(key('kColByPosAndVal',
concat(count(preceding-sibling::*),
'+',
sum)
)[2]
)])"/>
<xsl:variable name="vsum2" select=
"sum(stats[@set=2]/*/column
[not(key('kColByPosAndVal',
concat(count(preceding-sibling::*),
'+',
sum)
)[2]
)])"/>

Set 1 Set 2 Diff(Set 1 - Set 2)
Total (Diff) <xsl:text/>
<xsl:value-of select="$vsum1"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$vsum2"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$vsum1 -$vsum2"/>
<xsl:text>&#xA;</xsl:text>

<xsl:for-each select=
"*/*/column/@id
[generate-id()
= generate-id(key('kIdByVal',.)[1])
]
[not(key('kColByPosAndVal',
concat(count(../preceding-sibling::*),
'+',
../sum)
)[2]
)]">
<xsl:variable name="vcolSet1" select=
"/*/stats[@set=1]/*/column[@id=current()]/sum"/>

<xsl:variable name="vcolSet2" select=
"/*/stats[@set=2]/*/column[@id=current()]/sum"/>
Column <xsl:value-of select=".+1"/><xsl:text/>
<xsl:text> </xsl:text>
<xsl:value-of select="$vcolSet1"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$vcolSet2"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$vcolSet1 -$vcolSet2"/>
<xsl:text>&#xA;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时 :
<export>
<stats set="1">
<columns>
<column id="0">
<sum>100</sum>
</column>
<column id="1">
<sum>102</sum>
</column>
<column id="2">
<sum>12</sum>
</column>
</columns>
</stats>
<stats set="2">
<columns>
<column id="0">
<sum>100</sum>
</column>
<column id="1">
<sum>101</sum>
</column>
<column id="2">
<sum>19</sum>
</column>
</columns>
</stats>
</export>

产生所需的正确结果:
                 Set 1          Set 2       Diff(Set 1 - Set 2)
Total (Diff) 114 120 -6

Column 2 102 101 1

Column 3 12 19 -7

解释:
  • 名为kColByPosAndVal的键用于选择所有具有给定位置(在所有column sibling 中)和其sum 子元素给定值的所有列。
  • 在Muenchian分组中使用名为kIdByVal的键来查找id属性的所有不同值。
  • 仅计算这些列的总和,即kColByPosAndVal键仅选择一个column元素(如果选择了两个column元素,则它们都在相同位置且具有相同sum)。
  • 其余内容应该易于理解
  • 关于xslt - XSL条件总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4392797/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com