XSLT - xpath axes uvnitř cyklu

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
XSLT - xpath axes uvnitř cyklu
« kdy: 17. 07. 2021, 13:29:55 »
Ahoj...
mám foreach cyklus a v něm vytvářím XML strukturu. První kolo cyklu vytvoří část struktury a v dalším kole bych potřeboval pomocí xpath axes se na tu strukturu dostat. Lze to vůbec?
Potřeboval bych získat hodnotu elementu ze struktury, kterou vytvořilo předchozí kolo cyklu.

Kód: [Vybrat]
<xsl:for-each select="/bla/bla/bla/neco">
      <xsl:variable name="Round" select="position()"></xsl:variable>
      <Pack>
      <Parent>Pallet</Parent>
      <xsl:choose>
            <xsl:when test="$Round='1'">
             <Number><xsl:value-of select="position()"></xsl:value-of></Number>
        </xsl:when>
        <xsl:otherwise>
             <Number><xsl:value-of select="./ancestor::Pack/Number +1"></xsl:value-of></Number>
        </xsl:otherwise>
      </xsl:choose>
</xsl:for-each>
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


Kit

  • *****
  • 644
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #1 kdy: 17. 07. 2021, 13:36:38 »
Zkus zapomenout na existenci xsl:for-each a udělej to pořádně. Uvidíš, že to bude o dost jednodušší.

Dodej sem ukázku XML a požadovaný výsledek. Testovací data se mi vymejšlet nechce.

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #2 kdy: 17. 07. 2021, 13:40:55 »
Zkus zapomenout na existenci xsl:for-each a udělej to pořádně. Uvidíš, že to bude o dost jednodušší.

Dodej sem ukázku XML a požadovaný výsledek. Testovací data se mi vymejšlet nechce.
XML struktura vzniká právě v tom cyklu foreach.
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Kit

  • *****
  • 644
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #3 kdy: 17. 07. 2021, 13:44:56 »
Zkus zapomenout na existenci xsl:for-each a udělej to pořádně. Uvidíš, že to bude o dost jednodušší.

Dodej sem ukázku XML a požadovaný výsledek. Testovací data se mi vymejšlet nechce.
XML struktura vzniká právě v tom cyklu foreach.

Měl jsem na mysli vstupní XML. Mám si ho snad vycucat z prstu?

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #4 kdy: 17. 07. 2021, 14:10:23 »
Měl jsem na mysli vstupní XML. Mám si ho snad vycucat z prstu?

Vstupní struktura je zde k ničemu, protože na ni se jen odkazuju cyklusem. Nebudu sem dávat kompletní vstup(je obrovskej), ale logika je takováto.
Vstupní payload:
Kód: [Vybrat]
<ResultsSet>
   <ResultSet>
     <Row><Parent>11</Parent></Row>
     <Row><Parent>10</Parent></Row>
     <Row><Parent>6</Parent></Row>
   </ResultSet>
   <ResultSet>
     <Row>
         <Child>aaa</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>bbb</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>ccc</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>ddd</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>zzz</Child>
         <Parent>6</Parent>
     </Row>
   </ResultSet>
</ResultsSet>

V následujícím payloadu:
Kód: [Vybrat]
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
      <xsl:variable name="Round" select="position()"></xsl:variable>
      <Pack>
      <Parent>Pallet</Parent>
      <ID><xsl:value-of select="Parent"/></Parent>
      <xsl:choose>
            <xsl:when test="$Round='1'">
             <Number><xsl:value-of select="position()"></xsl:value-of></Number>
        </xsl:when>
        <xsl:otherwise>
             <Number><xsl:value-of select="./ancestor::Pack/Number +1"></xsl:value-of></Number>
        </xsl:otherwise>
      </xsl:choose>
</xsl:for-each>
S osama potřebuji pracovat až na nově vznikající xml struktuře uvnitř cyklu. Hodnota v elementu <Number> se bude měnit ještě na základě jiných podmínek, ale do toho nemá smysl zabředávat. Otazka zní, zda se pomocí xpath axes dá ukazovat na strukturu, která je vytvořena v předchozím kole cyklu.
« Poslední změna: 17. 07. 2021, 14:13:54 od ZAJDAN »
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


BoneFlute

  • *****
  • 1 745
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #5 kdy: 17. 07. 2021, 17:18:45 »
Měl jsem na mysli vstupní XML. Mám si ho snad vycucat z prstu?

Vstupní struktura je zde k ničemu, protože na ni se jen odkazuju cyklusem. Nebudu sem dávat kompletní vstup(je obrovskej), ale logika je takováto.
Vstupní payload:
Kód: [Vybrat]
<ResultsSet>
   <ResultSet>
     <Row><Parent>11</Parent></Row>
     <Row><Parent>10</Parent></Row>
     <Row><Parent>6</Parent></Row>
   </ResultSet>
   <ResultSet>
     <Row>
         <Child>aaa</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>bbb</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>ccc</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>ddd</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>zzz</Child>
         <Parent>6</Parent>
     </Row>
   </ResultSet>
</ResultsSet>

V následujícím payloadu:
Kód: [Vybrat]
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
      <xsl:variable name="Round" select="position()"></xsl:variable>
      <Pack>
      <Parent>Pallet</Parent>
      <ID><xsl:value-of select="Parent"/></Parent>
      <xsl:choose>
            <xsl:when test="$Round='1'">
             <Number><xsl:value-of select="position()"></xsl:value-of></Number>
        </xsl:when>
        <xsl:otherwise>
             <Number><xsl:value-of select="./ancestor::Pack/Number +1"></xsl:value-of></Number>
        </xsl:otherwise>
      </xsl:choose>
</xsl:for-each>
S osama potřebuji pracovat až na nově vznikající xml struktuře uvnitř cyklu. Hodnota v elementu <Number> se bude měnit ještě na základě jiných podmínek, ale do toho nemá smysl zabředávat. Otazka zní, zda se pomocí xpath axes dá ukazovat na strukturu, která je vytvořena v předchozím kole cyklu.

Předpokládejme, že chceš takovýto výstup:
Kód: [Vybrat]
<Workbook>
<Pack>
<ID>11</ID>
<Items>
<Child>aaa</Child>
<Child>bbb</Child>
</Items>
</Pack>
<Pack>
<ID>10</ID>
<Items>
<Child>ccc</Child>
<Child>ddd</Child>
</Items>
</Pack>
<Pack>
<ID>6</ID>
<Items>
<Child>zzz</Child>
</Items>
</Pack>
</Workbook>

Takhle by to nešlo?

Kód: [Vybrat]
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<Workbook>
<xsl:call-template name="Pack" />
</Workbook>
</xsl:template>


<xsl:template name="Pack">
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
<xsl:variable name="Parent" select="Parent"/>
<Pack>
<ID><xsl:value-of select="Parent"/></ID>
<Items>
<xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent = $Parent]">
<Child><xsl:value-of select="Child"/></Child>
</xsl:for-each>
</Items>
</Pack>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


Mám za to, že ve foreach v každé iteraci pracuje vždy s původním zdrojem. Tudíž tak jak si to představuješ to nejde. (Ani to není dobrý nápad, mění se ti data pod rukama.)

Takže mě napadají dva způsoby:
1/ buď nepracovat s lokálním nodem, ale jít o úroveň víš, a zpracovat si v ciklu najednou všechno co potřebuješ (viz má ukázka)
2/ nebo nejdřív zpracovat část v celém ciklu, a pak nad výsledkem projet nové kolo s další logikou - volat šablonu nad výsledkem jiné šablony (to žel neumím).

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #6 kdy: 17. 07. 2021, 18:17:25 »
Otazka zní, zda se pomocí xpath axes dá ukazovat na strukturu, která je vytvořena v předchozím kole cyklu.
Nijak rozumně ne, protože to popírá celý princip, na kterém je XSLT založeno. XSLT není imperativní ale deklarativní, např. jako SQL. V předchozím cyklu se nemůže dít nic magického, co by nešlo získat z původních dat.

V tom vašem příkladu je xsl:for-each úplně zbytečné, použijte normální xsl:apply-templates. A tam, kde se pokoušíte odkazovat na předchozí pole cyklu, se normálně odkažte na původní data, ze kterých jste to chtěl v tom cyklu počítat.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #7 kdy: 17. 07. 2021, 18:35:01 »
Konkrétně ten váš pseudopříklad, kde jste se chtěl odkazovat na předchozí kolo cyklu, se dá přepsat na triviální:

Kód: [Vybrat]
<xsl:template match="/ResultsSet/ResultSet[1]/Row">
  <Pack>
      <Parent>Pallet</Parent>
      <ID><xsl:value-of select="Parent"/></Parent>
      <Number><xsl:value-of select="position()" /></Number>
  </Pack>
</xsl:for-each>

Kit

  • *****
  • 644
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #8 kdy: 17. 07. 2021, 19:47:53 »
Konkrétně ten váš pseudopříklad, kde jste se chtěl odkazovat na předchozí kolo cyklu, se dá přepsat na triviální:

Kód: [Vybrat]
<xsl:template match="/ResultsSet/ResultSet[1]/Row">
  <Pack>
      <Parent>Pallet</Parent>
      <ID><xsl:value-of select="Parent"/></Parent>
      <Number><xsl:value-of select="position()" /></Number>
  </Pack>
</xsl:for-each>

Až na tu chybu na posledním řádku a chybné párování ID a Parent to vypadá dobře.

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #9 kdy: 17. 07. 2021, 21:24:15 »
1) Omlouvám se za nepřesný popis případu, níže to vyjasním lépe.
2) To co chci, dokážu, ale tak, že zpracuji cyklem a XML výstup v dalším payloadu ztransformuju.
3) To stejné bych ale chtěl docílit v rámci jednoho payloadu, pravděpodobně pomocí template jak tady zmiňujete.

V ResultSet[1] mám seznam palet. V ResultSet[2] mám seznam krabic a na jaké paletě leží <Parent>.
Celý problém tkví v tom, že v hlavním xsl:foreach cyklu je ještě vnitřní cyklus a v obouch používám position().
Ve vnitřním cyklu jen přičítám +1 aby sekvenční číslo jednotlivých <Package> iterovalo správně.
Takže vznikne první element Package typu paleta a následujou Package typu box co jsou na ní naloženy. Pak další Package typu paleta a za ním Package typu box co jsou na ní.
Havní problém je v tom, že se počítá pomocí position() v obou cyklech a tím nikdy nevznikne postupné číslování.
Další, co pak budu řešit, je přiřadit všem Package typu Box sekvenční číslo jejich palety/rodiče.

Kód: [Vybrat]
<ResultsSet>
   <ResultSet>
     <Row><Parent>11</Parent></Row>
     <Row><Parent>10</Parent></Row>
     <Row><Parent>6</Parent></Row>
   </ResultSet>
   <ResultSet>
     <Row>
         <Child>aaa</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>bbb</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>ccc</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>ddd</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>zzz</Child>
         <Parent>6</Parent>
     </Row>
   </ResultSet>
</ResultsSet>

Kód: [Vybrat]
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
    <xsl:variable name="Parent" select="/ResultsSet/ResultSet[1]/Row/Parent"></xsl:variable>
    <Pack>
<Type>Pallet<Type>
<ID><xsl:value-of select="Parent"/></ID>
<Sequence><xsl:value-of select="position()"></Sequence>
    </Pack>

    <xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent='$Parent']">
    <Pack>
<Type>Box<Type>
<ID><xsl:value-of select="Child"></ID>
<Sequence><xsl:value-of select="position() +1"></Sequence>
<Parent>sekvenční číslo rodičovské palety</Parent>
    </Pack>
    </xsl:for-each>
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

Kit

  • *****
  • 644
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #10 kdy: 17. 07. 2021, 22:25:41 »
Co takhle zkusit použít<xsl:number>?

BoneFlute

  • *****
  • 1 745
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #11 kdy: 17. 07. 2021, 22:38:04 »
1) Omlouvám se za nepřesný popis případu, níže to vyjasním lépe.
2) To co chci, dokážu, ale tak, že zpracuji cyklem a XML výstup v dalším payloadu ztransformuju.
3) To stejné bych ale chtěl docílit v rámci jednoho payloadu, pravděpodobně pomocí template jak tady zmiňujete.

V ResultSet[1] mám seznam palet. V ResultSet[2] mám seznam krabic a na jaké paletě leží <Parent>.
Celý problém tkví v tom, že v hlavním xsl:foreach cyklu je ještě vnitřní cyklus a v obouch používám position().
Ve vnitřním cyklu jen přičítám +1 aby sekvenční číslo jednotlivých <Package> iterovalo správně.
Takže vznikne první element Package typu paleta a následujou Package typu box co jsou na ní naloženy. Pak další Package typu paleta a za ním Package typu box co jsou na ní.
Havní problém je v tom, že se počítá pomocí position() v obou cyklech a tím nikdy nevznikne postupné číslování.
Další, co pak budu řešit, je přiřadit všem Package typu Box sekvenční číslo jejich palety/rodiče.

Kód: [Vybrat]
<ResultsSet>
   <ResultSet>
     <Row><Parent>11</Parent></Row>
     <Row><Parent>10</Parent></Row>
     <Row><Parent>6</Parent></Row>
   </ResultSet>
   <ResultSet>
     <Row>
         <Child>aaa</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>bbb</Child>
         <Parent>11</Parent>
     </Row>
     <Row>
         <Child>ccc</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>ddd</Child>
         <Parent>10</Parent>
     </Row>
     <Row>
         <Child>zzz</Child>
         <Parent>6</Parent>
     </Row>
   </ResultSet>
</ResultsSet>

Kód: [Vybrat]
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
    <xsl:variable name="Parent" select="/ResultsSet/ResultSet[1]/Row/Parent"></xsl:variable>
    <Pack>
<Type>Pallet<Type>
<ID><xsl:value-of select="Parent"/></ID>
<Sequence><xsl:value-of select="position()"></Sequence>
    </Pack>

    <xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent='$Parent']">
    <Pack>
<Type>Box<Type>
<ID><xsl:value-of select="Child"></ID>
<Sequence><xsl:value-of select="position() +1"></Sequence>
<Parent>sekvenční číslo rodičovské palety</Parent>
    </Pack>
    </xsl:for-each>

Takže výsledek má vypadat takto?

Kód: [Vybrat]
<Workbook>
    <Pack>
<Type>Pallet<Type>
<ID>11</ID>
<Sequence>1</Sequence>
    </Pack>
    <Pack>
<Type>Pallet<Type>
<ID>10</ID>
<Sequence>2</Sequence>
    </Pack>
    <Pack>
<Type>Pallet<Type>
<ID>6</ID>
<Sequence>3</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>aaa</ID>
<Sequence>1</Sequence>
<Parent>1</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>bbb</ID>
<Sequence>2</Sequence>
<Parent>1</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ccc</ID>
<Sequence>3</Sequence>
<Parent>2</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ddd</ID>
<Sequence>4</Sequence>
<Parent>2</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>zzz</ID>
<Sequence>5</Sequence>
<Parent>3</Parent>
    </Pack>
</Workbook>

nebo takhle?

Kód: [Vybrat]
<Workbook>
    <Pack>
<Type>Pallet<Type>
<ID>11</ID>
<Sequence>1</Sequence>
    </Pack>
    <Pack>
<Type>Pallet<Type>
<ID>10</ID>
<Sequence>2</Sequence>
    </Pack>
    <Pack>
<Type>Pallet<Type>
<ID>6</ID>
<Sequence>3</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>aaa</ID>
<Sequence>1</Sequence>
<Parent>1</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>bbb</ID>
<Sequence>2</Sequence>
<Parent>1</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ccc</ID>
<Sequence>1</Sequence>
<Parent>2</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ddd</ID>
<Sequence>2</Sequence>
<Parent>2</Parent>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>zzz</ID>
<Sequence>1</Sequence>
<Parent>3</Parent>
    </Pack>
</Workbook>
« Poslední změna: 17. 07. 2021, 22:43:46 od BoneFlute »

BoneFlute

  • *****
  • 1 745
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #12 kdy: 17. 07. 2021, 22:51:40 »
...
Kód: [Vybrat]
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<Workbook>
<xsl:call-template name="Pack" />
</Workbook>
</xsl:template>


<xsl:template name="Pack">
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
<xsl:variable name="ParentId" select="Parent"/>
<xsl:variable name="ParentIndex" select="position()"/>
<Pack>
<Type>Pallet</Type>
<ID><xsl:value-of select="Parent"/></ID>
<Sequence><xsl:value-of select="position()" /></Sequence>
</Pack>
<xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent = $ParentId]">
<Pack>
<Type>Box</Type>
<Child><xsl:value-of select="Child"/></Child>
<Sequence><xsl:value-of select="position()" /></Sequence>
<Parent><xsl:value-of select="$ParentIndex" /></Parent>
</Pack>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #13 kdy: 17. 07. 2021, 22:54:15 »
Výsledek by měl být Paleta, boxy na ní, Paleta, boxy na ní.
Kód: [Vybrat]
<Workbook>
    <Pack>
<Type>Pallet<Type>
<ID>11</ID>
<Sequence>1</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>aaa</ID>
<Sequence>2</Sequence>
<Parent>1</Parent>
    </Pack>
<Type>Box<Type>
<ID>bbb</ID>
<Sequence>3</Sequence>
<Parent>1</Parent>
    </Pack>
<Pack>
<Type>Pallet<Type>
<ID>10</ID>
<Sequence>4</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ccc</ID>
<Sequence>5</Sequence>
<Parent>4</Parent>
    </Pack>
<Type>Box<Type>
<ID>ddd</ID>
<Sequence>6</Sequence>
<Parent>4</Parent>
    </Pack>
<Type>Pallet<Type>
<ID>6</ID>
<Sequence>7</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>zzz</ID>
<Sequence>8</Sequence>
<Parent>7</Parent>
    </Pack>
</Workbook>
   
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

BoneFlute

  • *****
  • 1 745
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #14 kdy: 18. 07. 2021, 00:15:59 »
Výsledek by měl být Paleta, boxy na ní, Paleta, boxy na ní.
Kód: [Vybrat]
<Workbook>
    <Pack>
<Type>Pallet<Type>
<ID>11</ID>
<Sequence>1</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>aaa</ID>
<Sequence>2</Sequence>
<Parent>1</Parent>
    </Pack>
<Type>Box<Type>
<ID>bbb</ID>
<Sequence>3</Sequence>
<Parent>1</Parent>
    </Pack>
<Pack>
<Type>Pallet<Type>
<ID>10</ID>
<Sequence>4</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>ccc</ID>
<Sequence>5</Sequence>
<Parent>4</Parent>
    </Pack>
<Type>Box<Type>
<ID>ddd</ID>
<Sequence>6</Sequence>
<Parent>4</Parent>
    </Pack>
<Type>Pallet<Type>
<ID>6</ID>
<Sequence>7</Sequence>
    </Pack>
    <Pack>
<Type>Box<Type>
<ID>zzz</ID>
<Sequence>8</Sequence>
<Parent>7</Parent>
    </Pack>
</Workbook>

Takhle?:
Kód: [Vybrat]
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<Workbook>
<xsl:call-template name="Pack" />
</Workbook>
</xsl:template>


<xsl:template name="Pack">
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
<xsl:variable name="ParentIndex" select="position()"/>
<xsl:variable name="ParentId" select="Parent"/>
<xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent = $ParentId]">
<xsl:if test="position() = 1">
<xsl:variable name="ParentSequence" select="$ParentIndex + count(preceding-sibling::Row)"/>
<Pack>
<Type>Pallet</Type>
<ID><xsl:value-of select="$ParentId"/></ID>
<Sequence><xsl:value-of select="$ParentSequence" /></Sequence>
</Pack>
<xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent = $ParentId]">
<Pack>
<Type>Box</Type>
<Child><xsl:value-of select="Child"/></Child>
<Parent><xsl:value-of select="$ParentSequence" /></Parent>
<Sequence><xsl:value-of select="$ParentIndex + 1 + count(preceding-sibling::Row)" /></Sequence>
</Pack>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>