子节点的 XSLT 键分组
XSLT Key Grouping for Child Nodes
<root>
<Entry>
<ID>1</ID>
<Details>
<Code>A1</Code>
<Value>1000</Value>
</Details>
<Details>
<Code>A2</Code>
<Value>2000</Value>
</Details>
</Entry>
<Entry>
<ID>2</ID>
<Details>
<Code>B1</Code>
<Value>1500</Value>
</Details>
<Details>
<Code>B2</Code>
<Value>2500</Value>
</Details>
<Details>
<Code>A3</Code>
<Value>3000</Value>
</Details>
</Entry>
</root>
我有这个输入 XML。对于每个 <Entry>
,我希望对 <Details>
节点(它们是 Entry 的子节点)进行分组,并最终通过以下代码对 <Value>
节点值求和 分组如下:
- 代码 A1、A2 和 A3 应组合在一起(比如 'A')
- 代码 B1、B2 和 B3 应归为一组(比如 'B')
[注意:代码仅为示例,实际代码完全不同,因此子字符串解决方案不起作用,请不要从字面上理解这些代码]
输出看起来像:
<Output>
<Output-Line>
<ID> 1 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum/>
</Output-Line>
<Output-Line>
<ID> 2 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum> 4000 </Sum>
</Output-Line>
</Output>
我目前面临的问题是 <xsl:key>
元素应该在顶部声明,而不是在 for-each 循环中的单个入口级别。因此,我无法通过匹配和使用表达式参数来形成正确的键。任何帮助表示赞赏。
提前致谢!
假设这只是 的另一个变体,您需要做的就是向 key()
函数调用添加另一个参数以将其限制为当前 Entry
:
XSLT 2.0
<xsl:stylesheet version="2.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="entry" match="Details" use="Code"/>
<xsl:template match="/root">
<Output>
<xsl:for-each select="Entry">
<Output-Line>
<xsl:copy-of select="ID"/>
<Code-group> A </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('A1', 'A2', 'A3'), .)/Value)" />
</Sum>
<Code-group> B </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('B1', 'B2', 'B3'), .)/Value)" />
</Sum>
</Output-Line>
</xsl:for-each>
</Output>
</xsl:template>
</xsl:stylesheet>
<root>
<Entry>
<ID>1</ID>
<Details>
<Code>A1</Code>
<Value>1000</Value>
</Details>
<Details>
<Code>A2</Code>
<Value>2000</Value>
</Details>
</Entry>
<Entry>
<ID>2</ID>
<Details>
<Code>B1</Code>
<Value>1500</Value>
</Details>
<Details>
<Code>B2</Code>
<Value>2500</Value>
</Details>
<Details>
<Code>A3</Code>
<Value>3000</Value>
</Details>
</Entry>
</root>
我有这个输入 XML。对于每个 <Entry>
,我希望对 <Details>
节点(它们是 Entry 的子节点)进行分组,并最终通过以下代码对 <Value>
节点值求和 分组如下:
- 代码 A1、A2 和 A3 应组合在一起(比如 'A')
- 代码 B1、B2 和 B3 应归为一组(比如 'B')
[注意:代码仅为示例,实际代码完全不同,因此子字符串解决方案不起作用,请不要从字面上理解这些代码]
输出看起来像:
<Output>
<Output-Line>
<ID> 1 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum/>
</Output-Line>
<Output-Line>
<ID> 2 </ID>
<Code-group> A </Code-group>
<Sum> 3000 </Sum>
<Code-group> B </Code-group>
<Sum> 4000 </Sum>
</Output-Line>
</Output>
我目前面临的问题是 <xsl:key>
元素应该在顶部声明,而不是在 for-each 循环中的单个入口级别。因此,我无法通过匹配和使用表达式参数来形成正确的键。任何帮助表示赞赏。
提前致谢!
假设这只是 key()
函数调用添加另一个参数以将其限制为当前 Entry
:
XSLT 2.0
<xsl:stylesheet version="2.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="entry" match="Details" use="Code"/>
<xsl:template match="/root">
<Output>
<xsl:for-each select="Entry">
<Output-Line>
<xsl:copy-of select="ID"/>
<Code-group> A </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('A1', 'A2', 'A3'), .)/Value)" />
</Sum>
<Code-group> B </Code-group>
<Sum>
<xsl:value-of select="sum(key('entry', ('B1', 'B2', 'B3'), .)/Value)" />
</Sum>
</Output-Line>
</xsl:for-each>
</Output>
</xsl:template>
</xsl:stylesheet>