Группировка ключей XSLT для дочерних узлов

<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> узлы (которые являются дочерними узлами входа) и в конечном итоге принимают сумму <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. Поэтому я не могу сформировать правильный ключ с параметрами соответствия и использования выражения. Любая помощь приветствуется.

Заранее спасибо!

1 ответ

Решение

Предполагая, что это всего лишь еще один вариант вашего предыдущего вопроса, все, что вам нужно сделать, это добавить еще один аргумент в 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>
Другие вопросы по тегам