Преобразование XML с помощью XSLT — группировка по дочернему элементу

Привет, ребята, не могли бы вы помочь мне с шаблоном xslt? Я ищу похожие проблемы с помощью поиска на этом сайте, но никто не работает для меня, как я ожидаю. Мне нужен основной групповой ключ.

Входной файл:

<?xml version = "1.0" encoding = "utf-8"?>
<S5Data>
  <ZasobaList>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "23544052-c0c9-435c-903d-3874e26ba260">
      <Group ID = "36de4745-a76f-4c5f-b80e-064a35bc96fc" Kod = "GRD2" />
      <Kod>P046</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List">
        <ZasobaDetail ObjectName = "ZasobaDetail" ObjectType = "Object" ID = "233d8125-3876-4a06-9299-b3e7dfd065e4">
          <Mnozstvi>2087.6000</Mnozstvi>
        </ZasobaDetail>
      </Detaily>
    </Zasoba>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "31287142-763e-42b5-b01e-7034671fe4b6">
      <Group ID = "a2495f5f-0bc7-4c66-a36d-8d40980d8ce7" Kod = "Nezaradené" />
      <Kod>P046</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List">
        <ZasobaDetail ObjectName = "ZasobaDetail" ObjectType = "Object" ID = "eae6ed21-fb14-4f55-8c7b-b4d69b67142c">
          <Mnozstvi>32847.2000</Mnozstvi>
        </ZasobaDetail>
      </Detaily>
    </Zasoba>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "9e1c0e68-1c49-451b-aa7a-aa2765114d45">
      <Group ID = "d35d96c8-d7b8-4e9b-a6cb-f511bb7486ae" Kod = "4E" />
      <Kod>RZP06</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List">
        <ZasobaDetail ObjectName = "ZasobaDetail" ObjectType = "Object" ID = "d9a3343d-af50-4bb6-aa0a-147c5fdddd20">
          <Mnozstvi>2.0000</Mnozstvi>
        </ZasobaDetail>
      </Detaily>
    </Zasoba>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "c24ed8ff-86d5-4b7b-9440-1b619fdf77f4">
      <Group ID = "a4ca53f8-3ee4-49a2-865e-71045390c3c5" Kod = "4E" />
      <Kod>RZP06</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List">
        <ZasobaDetail ObjectName = "ZasobaDetail" ObjectType = "Object" ID = "e00e71e9-4a1d-4863-b26c-854db8d884ff">
          <Mnozstvi>0.0000</Mnozstvi>
        </ZasobaDetail>
      </Detaily>
    </Zasoba>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "0cb69665-9405-466a-b4ce-433e78b9e7ba">
      <Group ID = "16d08933-6aac-455e-a256-a892901e03b9" Kod = "4E" />
      <Kod>RZP06</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List" />
    </Zasoba>
    <Zasoba ObjectName = "Zasoba" ObjectType = "Object" ID = "a7c09308-b399-4aac-9839-a58365cdc355">
      <Group ID = "3aa22f50-0076-41bd-8f9f-fbc91b2f71f5" Kod = "Nezaradené" />
      <Kod>RZP06</Kod>
      <Detaily ObjectName = "ZasobaDetail" ObjectType = "List">
        <ZasobaDetail ObjectName = "ZasobaDetail" ObjectType = "Object" ID = "e9b02461-78d1-4342-bfe5-80c4ff1273f6">
          <Mnozstvi>0.0000</Mnozstvi>
        </ZasobaDetail>
      </Detaily>
    </Zasoba>
  </ZasobaList>
</S5Data>

Мне нужен этот формат:

<?xml version = "1.0" encoding = "utf-8"?>
<S5Data>
  <ZasobaList>
    <Kod>P046</Kod>
    <Stav>2087.6000</Stav>
    <Stav>32847.2000</Stav>
    <Kod>RZP06</Kod>
    <Stav>2.0000</Stav>
    <Stav>0.0000</Stav>
    <Stav></Stav>
    <Stav>0.0000</Stav>
  </ZasobaList>
</S5Data>
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
   <!-- Identity transform -->
   <xsl:template match = "@* | node()">
      <xsl:copy>
         <xsl:apply-templates select = "@* | node()"/>
      </xsl:copy>
   </xsl:template>




<xsl:template match = "Zasoba">
           <xsl:element name = "Kod">
          <xsl:value-of select = "Kod" />  
                    </xsl:element>
            <xsl:element name = "Stav">
    <xsl:value-of select  = "Detaily"/>
            </xsl:element>
   </xsl:template>
   </xsl:stylesheet>

Результат:

<?xml version = "1.0" encoding = "utf-8"?>
<S5Data>
  <ZasobaList>
    <Kod>P046</Kod>
    <Stav>2087.6000</Stav>
    <Kod>P046</Kod>
    <Stav>32847.2000</Stav>
    <Kod>RZP06</Kod>
    <Stav>2.0000</Stav>
    <Kod>RZP06</Kod>
    <Stav>0.0000</Stav>
    <Kod>RZP06</Kod>
    <Stav></Stav>
    <Kod>RZP06</Kod>
    <Stav>0.0000</Stav>
  </ZasobaList>
</S5Data>

Я управляю своим шаблоном преобразования xslt, но в нем отсутствует foreach или что-то, что можно сгруппировать по дочернему узлу? Спасибо за помощь, извините за основной вопрос, но вчера я начал изучать xsl.

Вы найдете много информации о группировании в любом хорошем учебнике по XSLT, а когда вы изучаете новый язык, я рекомендую прочитать хороший учебник перед тем, как приступить к программированию — вы сэкономите себе много времени. Между тем, на этом сайте есть много примеров группировки, но вам нужно выбрать между XSLT 1.0 и 2.0; группировка намного проще в 2.0, и решения совсем другие.

Michael Kay 01.02.2023 15:35
stackoverflow.com/tags/xslt-grouping/info
Yitzhak Khabinsky 01.02.2023 15:37

если вам нужно использовать механизм Microsoft XSLT, вы застряли с XSLT 1.0, я не на 100% уверен, что вам вообще нужна группа, ваш ввод имеет уникальные значения элемента «Kod»?

MrD at KookerellaLtd 01.02.2023 16:38

ах да... есть дубликаты... вам нужно сгруппировать... так что, как говорит Майкл Кей, вам нужно посмотреть, можете ли вы использовать xslt 1.0

MrD at KookerellaLtd 01.02.2023 16:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

если это должен быть xslt 1.0, то это делает это

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
    <xsl:output method = "xml" indent = "yes"/>

    <xsl:key name = "lookup" match = "/S5Data/ZasobaList/Zasoba" use = "Kod" />
    
    <xsl:template match = "/">
        <S5Data>
            <ZasobaList>
                <xsl:for-each select = "S5Data/ZasobaList/Zasoba[generate-id(.) = generate-id(key('lookup',Kod)[1])]">
                    <Kod>
                        <xsl:value-of select = "Kod"/>
                    </Kod>
                    <xsl:for-each select = "key('lookup',Kod)">
                        <xsl:for-each select = "Detaily/ZasobaDetail/Mnozstvi">
                            <Stav>
                                <xsl:value-of select = "."/>
                            </Stav>
                        </xsl:for-each>
                    </xsl:for-each>
                    <Sum>
                        <xsl:value-of select = "sum(key('lookup',Kod)/Detaily/ZasobaDetail/Mnozstvi)"/>
                    </Sum>
                </xsl:for-each>
            </ZasobaList>
        </S5Data>
    </xsl:template>
</xsl:stylesheet>

Я изменил «ключ» на основе отзывов micheal.Hor257k и вашей проблемы с суммой.

это теперь выводит

<?xml version = "1.0" encoding = "utf-8"?>
<S5Data>
  <ZasobaList>
    <Kod>P046</Kod>
    <Stav>2087.6000</Stav>
    <Stav>32847.2000</Stav>
    <Sum>34934.799999999995</Sum>
    <Kod>RZP06</Kod>
    <Stav>2.0000</Stav>
    <Stav>0.0000</Stav>
    <Stav>0.0000</Stav>
    <Sum>2</Sum>
  </ZasobaList>
</S5Data>

(добро пожаловать в мир математики с плавающей запятой)

Я думаю, вы могли бы упростить это, определив ключ как <xsl:key name = "lookup" match = "Zasoba" use = "Kod" />. Тогда вы сможете избавиться от неловкого хождения вверх и вниз по дереву, чтобы получить соответствующий Mnozstvi.

michael.hor257k 01.02.2023 17:29

о да... правда.

MrD at KookerellaLtd 01.02.2023 17:57

Спасибо, ребята, @MrDatKookerellaLtd можно суммировать для каждого <Stav> в конце? Или может быть только сумма без всяких <Став>? Я редактирую свой вопрос и добавляю туда информацию. Спасибо

pac4 02.02.2023 08:52

@pac4 Пожалуйста, начните с определения вашего процессора — посмотрите, как это сделать: stackoverflow.com/a/25245033/3016153.

michael.hor257k 02.02.2023 09:08

@ michael.hor257k, когда я оставляю версию = "1.0" в xsl: stylesheet, вывод: Microsoft, 1.0. Но когда я меняю xsl: stylesheet на version = "2.0", вывод: Saxonica, 3.0

pac4 02.02.2023 09:38

Что ж, тогда используйте version = "2.0" или version = "3.0" и воспользуйтесь инструкцией xsl:for-each-group, представленной в XSLT 2.0: w3.org/TR/xslt20/#grouping . Здесь можно найти множество примеров этого, вот один из них: stackoverflow.com/a/74200281/3016153.

michael.hor257k 02.02.2023 10:24

Я пытаюсь, но дает мне только первое значение. pastecode.io/s/1x3y9rp2 или я вставил другой foreach ?

pac4 02.02.2023 10:49

@MrDatKookerellaLtd мой предыдущий комментарий был для вас (вопрос об удалении мода)...

pac4 02.02.2023 11:10

@ michael.hor257k спасибо, попробую в структуре XSLT 2.0 и xsl:for-each-group.

pac4 02.02.2023 11:11

@pac4.... я поставил сумму

MrD at KookerellaLtd 02.02.2023 12:20

Ребята, я сдаюсь, я пробую структуру XSLT2.0 с моими данными, и она не работает или полностью портит программное обеспечение и замораживает его.

pac4 02.02.2023 12:36

хорошо, у вас есть решение xslt 1.0, которое вы можете использовать.

MrD at KookerellaLtd 02.02.2023 12:43

решение суммы находится в моем «ответе»

MrD at KookerellaLtd 02.02.2023 13:01

@MrDatKookerellaLtd Большое спасибо, работает, я скучаю по обновлению вашего ответа. Работающий.

pac4 02.02.2023 13:21

Другие вопросы по теме