如何使用 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 我想处理。 collectionA 与 collectionB 有关,我想从中获得所有相关 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>
我需要帮助来使用 XSL 1.0 处理以下 XML 文档,但我没有文字来描述实际问题。
我有一个项目集合 collectionA 我想处理。 collectionA 与 collectionB 有关,我想从中获得所有相关 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>