如何使用 XSLT 1.0 遍历和求和具有多对多关系的 XML 文档?

How to traverse and sum XML document with many-to-many relationship using XSLT 1.0?

我需要帮助来使用 XSL 1.0 处理以下 XML 文档,但我没有文字来描述实际问题。

我有一个项目集合 collectionA 我想处理。 collectionAcollectionB 有关,我想从中获得所有相关 num 值的总和.该关系是一个多对多关系,由连接 A 和 B 项目的 collectionC 项定义。

在任何其他基于对象模型的编程语言中,我都会使用循环。问题是我看不到如何循环和收集 xslt 1.0 中所有值的总和...?

<root>
 <collectionA>
   <id>1</id>
 </collectionA>
 <collectionA>
  <id>2</id>
 </collectionA>

 <collectionB>
  <id>1</id>
  <num>11</num>
 </collectionB>
 <collectionB>
  <id>2</id>
  <num>22</num>
 </collectionB>
 <collectionB>
  <id>3</id>
  <num>33</num>
 </collectionB>
 <collectionB>
  <id>4</id>
  <num>44</num>
 </collectionB>

 <collectionC>
  <collectionAid>1</collectionAid>
  <collectionBid>1</collectionBid>
  <collectionBid>2</collectionBid>
 </collectionC>
 <collectionC>
  <collectionAid>2</collectionAid>
  <collectionBid>3</collectionBid>
  <collectionBid>4</collectionBid>
 </collectionC>
</root>

预期结果是:

<root>
 <collectionA>
  <id>1</id>
  <sum>33</sum>
 </collectionA>
 <collectionA>
  <id>2</id>
  <sum>77</sum>
 </collectionA>
</root>

有人吗!?

I don't see how to both loop AND to collect the sum of all values

您不需要执行其中任何一项。您只需要一对 keys 来解析交叉引用。然后将它们用于 select 相关节点并求和它们的值:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="b" match="collectionB" use="id" />
<xsl:key name="c" match="collectionC" use="collectionAid" />

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="collectionA">
            <xsl:copy>
                <xsl:copy-of select="id"/>
                <sum>
                    <xsl:value-of select="sum(key('b', key('c', id)/collectionBid)/num)"/>
                </sum>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>