Привет, ребята, не могли бы вы помочь мне с шаблоном 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.
если вам нужно использовать механизм Microsoft XSLT, вы застряли с XSLT 1.0, я не на 100% уверен, что вам вообще нужна группа, ваш ввод имеет уникальные значения элемента «Kod»?
ах да... есть дубликаты... вам нужно сгруппировать... так что, как говорит Майкл Кей, вам нужно посмотреть, можете ли вы использовать xslt 1.0
если это должен быть 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
.
о да... правда.
Спасибо, ребята, @MrDatKookerellaLtd можно суммировать для каждого <Stav> в конце? Или может быть только сумма без всяких <Став>? Я редактирую свой вопрос и добавляю туда информацию. Спасибо
@pac4 Пожалуйста, начните с определения вашего процессора — посмотрите, как это сделать: stackoverflow.com/a/25245033/3016153.
@ michael.hor257k, когда я оставляю версию = "1.0" в xsl: stylesheet, вывод: Microsoft, 1.0. Но когда я меняю xsl: stylesheet на version = "2.0", вывод: Saxonica, 3.0
Что ж, тогда используйте version = "2.0"
или version = "3.0"
и воспользуйтесь инструкцией xsl:for-each-group
, представленной в XSLT 2.0: w3.org/TR/xslt20/#grouping . Здесь можно найти множество примеров этого, вот один из них: stackoverflow.com/a/74200281/3016153.
Я пытаюсь, но дает мне только первое значение. pastecode.io/s/1x3y9rp2 или я вставил другой foreach ?
@MrDatKookerellaLtd мой предыдущий комментарий был для вас (вопрос об удалении мода)...
@ michael.hor257k спасибо, попробую в структуре XSLT 2.0 и xsl:for-each-group.
@pac4.... я поставил сумму
Ребята, я сдаюсь, я пробую структуру XSLT2.0 с моими данными, и она не работает или полностью портит программное обеспечение и замораживает его.
хорошо, у вас есть решение xslt 1.0, которое вы можете использовать.
решение суммы находится в моем «ответе»
@MrDatKookerellaLtd Большое спасибо, работает, я скучаю по обновлению вашего ответа. Работающий.
Вы найдете много информации о группировании в любом хорошем учебнике по XSLT, а когда вы изучаете новый язык, я рекомендую прочитать хороший учебник перед тем, как приступить к программированию — вы сэкономите себе много времени. Между тем, на этом сайте есть много примеров группировки, но вам нужно выбрать между XSLT 1.0 и 2.0; группировка намного проще в 2.0, и решения совсем другие.