XML : Advanced XSLT: cut name, find and copy multiple keys and nodes

I have a product XML where the various product variants are individually, but I want to combine them:

  <xml>     <produkt>        <kod_polozky>B16004V</kod_polozky>        <nazov_produktu>Bicykel Dema SCUD 9.0 white-blue 550 mm</nazov_produktu>        <strucny_popis_produktu />        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>     </produkt>     <produkt>        <kod_polozky>B16003V</kod_polozky>        <nazov_produktu>Bicykel Dema SCUD 9.0 white-blue 520 mm</nazov_produktu>        <strucny_popis_produktu />        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>     </produkt>     <produkt>        <kod_polozky>B16002V</kod_polozky>        <nazov_produktu>Bicykel Dema SCUD 9.0 red 550 mm</nazov_produktu>        <strucny_popis_produktu />        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>     </produkt>     <produkt>        <kod_polozky>B160051V</kod_polozky>        <nazov_produktu>Bicykel Dema SCUD 9.0 red 520 mm</nazov_produktu>        <strucny_popis_produktu />        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>     </produkt>  </xml>    

Desidered output:

  <xml>    <produkt>      <kod_polozky>B16004V</kod_polozky>      <nazov_produktu>Bicykel Dema SCUD 9.0</nazov_produktu>      <strucny_popis_produktu/>      <popis_produktu>Some description</popis_produktu>      <znacka>DEMA</znacka>      <skladom>Yes</skladom>      <mj>ks</mj>      <cena>1899,99</cena>      <variant id="1">        <kod_polozky>B16004V</kod_polozky>        <nazov_produktu>white-blue 550 mm</nazov_produktu>        <strucny_popis_produktu/>        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>      </variant>      <variant id="2">        <kod_polozky>B16003V</kod_polozky>        <nazov_produktu>white-blue 520 mm</nazov_produktu>        <strucny_popis_produktu/>        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>      </variant>      <variant id="3">        <kod_polozky>B16002V</kod_polozky>        <nazov_produktu>red 550 mm</nazov_produktu>        <strucny_popis_produktu/>        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>      </variant>      <variant id="4">        <kod_polozky>B16001V</kod_polozky>        <nazov_produktu>red 520 mm</nazov_produktu>        <strucny_popis_produktu/>        <popis_produktu>Some description</popis_produktu>        <znacka>DEMA</znacka>        <skladom>Yes</skladom>        <mj>ks</mj>        <cena>1899,99</cena>      </variant>    </produkt>  </xml>    

In short:

If we find multiple instance of <nazov_produktu>, in the example it is "Bicykel Dema SCUD 9.0":

  • cut the <nazov_produktu> at the position where it is matching with another similar product. The hard thing: how we determine which products are similar? There are example other models like:

    • "Bicykel Dema Anothermodel"
    • "Bicykel Dema XY red"

-> and It should not be cut at "Bicykel Dema"

  • -create <variant id="x">, where <nazov_produktu> name is inverted, we need the end of the name "red 520 mm".

I have basic XSLT knowledge, but this one is totally out of my knowledge. I don't know whether it's possible at all?

No comments:

Post a Comment