1
<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 循环中的单个条目级别。因此,我无法使用匹配和使用表达式参数形成正确的键。任何帮助表示赞赏。

提前致谢!

4

1 回答 1

2

假设这只是您上一个问题的另一个变体,您需要做的就是在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>
于 2020-10-15T09:22:00.063 回答