gpt4 book ai didi

XSLT:小计

转载 作者:行者123 更新时间:2023-12-02 00:27:43 28 4
gpt4 key购买 nike

源 XML:

<Root>
<Data>
<Code>A</Code>
<Value>10</Value>
</Data>
<Data>
<Code>A</Code>
<Value>10</Value>
</Data>
<Data>
<Code>B</Code>
<Value>10</Value>
</Data>
<Data>
<Code>A</Code>
<Value>2</Value>
</Data>
<Data>
<Code>C</Code>
<Value>10</Value>
</Data>
<Data>
<Code>A</Code>
<Value>5</Value>
</Data>
<Data>
<Code>B</Code>
<Value>4</Value>
</Data>
<Data>
<Code>A</Code>
<Value>10</Value>
</Data>
<Data>
<Code>C</Code>
<Value>10</Value>
</Data>
<Data>
<Code>B</Code>
<Value>10</Value>
</Data>
<Data>
<Code>A</Code>
<Value>10</Value>
</Data>
<Data>
<Code>C</Code>
<Value>5</Value>
</Data>
....
</Root>

XSL-FO 代码:

我的代码(XSL-FO)包含 3 列,每列包含“A”、“B”、“C”的内容

<fo:table-body>
<xfd:table-row-repeat xpath="Root/Data" font-family="Arial Narrow" font-size="10pt" padding-after="0.55cm">
<xsl:if test="Code='A'">
<fo:table-cell>
<fo:block height="12pt">Value
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="Value" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</xsl:if>
</xfd:table-row-repeat>
</fo:table-body>

每列使用相同的代码来显示“B”和“C”的值在表页脚中,我必须获得“A”、“B”、“C”的小计

<fo:table-body>
<xfd:table-row-repeat xpath="Root/Data" font-family="Arial Narrow" font-size="10pt" padding-after="0.55cm">
<xsl:if test="Code='A'">
<fo:table-cell>
<fo:block height="12pt">SubTotal
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<--Here Sum of first 15 A's. if the A's or B's or C's exceed by 15, then the table flows to 2nd Page. In that case, 1st Page table-footer shows individual subtotals of first 15 A's, 15 B's and C's. In 2nd Page, the subtotals should contain Subtotal of first 15 A's+ Succeeding A's, in the same way B's and C's -->
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</xsl:if>
</xfd:table-row-repeat>
</fo:table-body>

此处仅显示一列的 XSL-FO 代码(对于 Root/Data/Code='A'),其他 2 列('B' 和 'C')包含相同的代码。

详细条件:

Condition 1): when Root/Data/Code = 'A' or 'B' or 'C'
i need individual totals of 'A', 'B' and 'C' in Table-Footer individual Column.

Condition 2): inturn if individual count(Root/Data/Code) of 'A', 'B' & 'C' crosses 15. Then Page flows to 2nd Page then Table-Footer in 2nd Page needs to contains subtotal of first 15 A's + the sum of succeeding A's in the same way for B's And C's

即,如果源 XML 中存在 20 个 A、10 个 B 和 25 个 C。

In 1st Page, Table-Footer

SubtotalI(Value of 15 A's)=
SubtotalII(Value 10 B's)=
SubtotalIII(Value 15 C's)=

In 2nd Page, Table-Footer

SubtotalI(15 A's+ next 5 A's)=
SubtotalII(Value 10 B's)= <!--No Change as count of B's is less than 15 -->
SubtotalIII(15 C's + next 10 C's)=

我正在尝试使用 xsl:key 通过代码标记分组来评估“A”、“B”和“C”之和的逻辑。由于我是 XSLT 的新手,我发现使用 xsl:key 解决这个逻辑太困难了。谁能帮忙解决这个逻辑?

提前致谢

最佳答案

您想要实现的目标存在一些困难。实际上,计算给定点的小计是最简单的。您只需要前一个轴和一个总和即可计算它:

sum(preceding::Value[../Code = 'A'])

要包含当前值,请使用联合运算符,如下所示:

sum(Value[../Code = 'A'] | preceding::Value[../Code = 'A'])

更大的困难是在每个页面上显示不同的表格“页脚”。页眉和页脚会自动在页面上重复,但表格跨越的所有页面的内容都是相同的。我看到的唯一解决方案是自己破坏表格,每次添加不同的表格页脚。

到目前为止,最简单的方法是一次仅获取固定数量的数据元素,并将它们显示在单独的表中。您可以在一个 for-each 中循环遍历 A、B 和 C 类型,为每个值提供单独的行。这样表的行数始终相同。您可以尝试可以包含的数字,以确定一页上可以容纳多少个数字。

以下代码返回包含前 10 个数据值的表。 A、B 和 C 值直接位于彼此下方,但如果您愿意,也可以将它们分别放置在左侧、中间和右侧。在表格底部添加了三行,其中包含 A、B 和 C 的小计。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="global">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="global">
<fo:flow flow-name="xsl-region-body">

<fo:block>
<fo:table table-layout="fixed" width="150mm" border-style="solid">
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="50mm"/>
<fo:table-column column-width="50mm"/>

<fo:table-body font-size="7pt">
<xsl:for-each select="/Root/Data[10 >= position()]">
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">
<xsl:value-of select="Code" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="Value" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>

<xsl:if test="position() = last()">
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal A</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'A'] | Value[../Code = 'A'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal B</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'B'] | Value[../Code = 'B'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row border-style="solid">
<fo:table-cell>
<fo:block height="12pt">Subtotal C</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt" border="0.1pt solid black" text-align="center">
<xsl:value-of select="sum(preceding::Value[../Code = 'C'] | Value[../Code = 'C'])" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block height="12pt">Points</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>

</fo:flow>
</fo:page-sequence>

</fo:root>
</xsl:template>

</xsl:stylesheet>

您仍然需要一些东西来确定您需要多少个包含 n 个数据项的表,然后进行一些递归调用以输出所有这些数据。希望这足以让您再次出发!

PS:我注意到您正在使用 xfd 前缀。看起来您正在使用 Ecrion 的 XF Designer。我对它不是很熟悉。上面的代码是一个普通的 XSLT 1.0 解决方案。不确定它在 XF Designer 中是否有效,请告诉我..

关于XSLT:小计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715999/

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