子节点的 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> 节点值求和 分组如下:

  1. 代码 A1、A2 和 A3 应组合在一起(比如 'A')
  2. 代码 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>