Узлы группы XSLT по ключу, указанному в элементе - PullRequest
0 голосов
/ 07 ноября 2019

Я получил неприятный XML, где узлы не сгруппированы так, как я хочу, и я пытаюсь найти способ сгруппировать их, указав <master_key> в узле:

raw xml :

<root>
   <zasoba>
      <kod>388300-56</kod>
      <description>50cm</description>
      <master_key>388300MK</master_key>
      <kategorie/>
   </zasoba>
   <zasoba>
      <kod>388300-53</kod>
      <description>53cm</description>
      <master_key>388300MK</master_key>
      <kategorie/>
   </zasoba>
   <zasoba>
      <kod>388300MK</kod>
      <description>Master</description>
      <kategorie/>
   </zasoba>
   <zasoba>
      <kod>388399-56</kod>
      <description>56cm</description>
      <master_key>388399MK</master_key>
      <kategorie/>
   </zasoba>
   <zasoba>
      <kod>388399-57</kod>
      <description>57cm</description>
      <master_key>388399MK</master_key>
      <kategorie/>
   </zasoba>
   <zasoba>
      <kod>388399MK</kod>
      <description>Master 2</description>
      <kategorie/>
   </zasoba>
</root>

Там варианты продукта разделены на отдельные элементы, но я бы хотел перейти под основной элемент (определенный master_key) под новым именем элемента <variant>.

Вывод должен выглядеть следующим образом:

<root>
   <zasoba>
      <kod>388300MK</kod>
      <description>Master 2</description>
      <kategorie/>
      <variant>
         <kod>388300-56</kod>
         <description>50cm</description>
         <master_key>388300MK</master_key>
         <kategorie/>
      </variant>
      <variant>
         <kod>388300-53</kod>
         <description>53cm</description>
         <master_key>388300MK</master_key>
         <kategorie/>
      </variant>
   </zasoba>
   <zasoba>
      <kod>388399MK</kod>
      <description>Master</description>
      <kategorie/>
      <variant>
         <kod>388399-56</kod>
         <description>56cm</description>
         <master_key>388399MK</master_key>
         <kategorie/>
      </variant>
      <variant>
         <kod>388399-57</kod>
         <description>57cm</description>
         <master_key>388399MK</master_key>
         <kategorie/>
      </variant>
   </zasoba>
</root>

1 Ответ

1 голос
/ 07 ноября 2019

К счастью, XPath достаточно гибок, чтобы выбрать группировку населения в нужном вам порядке и ключ группировки с существующим значением:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each-group select="zasoba[not(master_key)], zasoba[master_key]" group-by="(master_key, kod)[1]">
              <xsl:copy>
                  <xsl:apply-templates/>
                  <xsl:apply-templates select="tail(current-group())"/>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="zasoba">
      <variant>
          <xsl:apply-templates/>
      </variant>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / ejivdHb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...