XSLT - xpath axes uvnitř cyklu

ZAJDAN

  • *****
  • 2 110
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #15 kdy: 18. 07. 2021, 01:06:48 »
Citace od: BoneFlute kdy 18. 07. 2021, 00:15:59
....
Díky zkusil jsem, ale Sekvence je počítána špatně.
Cílem je, aby sekvence šla plynule za sebou, bez ohledu na to, zda je to paleta nebo box.
A u boxů pak dosazovat do <Parent> sekvenci jejich palety.
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

  • *****
  • 2 155
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #16 kdy: 18. 07. 2021, 03:01:26 »
Citace od: ZAJDAN kdy 18. 07. 2021, 01:06:48
Citace od: BoneFlute kdy 18. 07. 2021, 00:15:59
....
Díky zkusil jsem, ale Sekvence je počítána špatně.
Cílem je, aby sekvence šla plynule za sebou, bez ohledu na to, zda je to paleta nebo box.
A u boxů pak dosazovat do <Parent> sekvenci jejich palety.

Toto je výsledek:
<?xml version="1.0" encoding="utf-8"?>
<Workbook>
<Pack>
<Type>Pallet</Type>
<ID>11</ID>
<Sequence>1</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>aaa</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>bbb</Child>
<Parent>1</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>10</ID>
<Sequence>4</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ccc</Child>
<Parent>4</Parent>
<Sequence>5</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ddd</Child>
<Parent>4</Parent>
<Sequence>6</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>6</ID>
<Sequence>7</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>zzz</Child>
<Parent>7</Parent>
<Sequence>8</Sequence>
</Pack>
</Workbook>


Tobě to nedělá? Nebo to je špatnej výsledek?

Používám Xalan, ale mělo by to být natolik standardní, že by na tom nemělo záležet.

ZAJDAN

  • *****
  • 2 110
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #17 kdy: 18. 07. 2021, 10:36:03 »
Palety iterují jen na sobě, boxy jen v jednom kole.
Počítá mi to takto:
<Pack>
<Type>Pallet</Type>
<ID>11</ID>
<Sequence>1</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>aaa</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>bbb</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>10</ID>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ccc</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ddd</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>6</ID>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>zzz</Child>
<Parent>3</Parent>
<Sequence>4</Sequence>
</Pack>
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.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #18 kdy: 18. 07. 2021, 11:04:02 »
Citace od: ZAJDAN kdy 17. 07. 2021, 21:24:15
Ve vnitřním cyklu jen přičítám +1 aby sekvenční číslo jednotlivých <Package> iterovalo správně.
To je přímo vzorový příklad, kdy nemůžete použít for-each.

K očíslování vstupních elementů slouží <xsl:number />. Takže tam, kde potřebujete získat pořadové číslo, použijte <xsl:number count="Pack" select="XXX"/> kde za XXX dosadíte selektor pro uzel, jehož pořadí potřebujete získat – v případě palety to tedy bude aktuální uzel, v případě boxu to bude uzel získaný přes Parent.

ZAJDAN

  • *****
  • 2 110
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #19 kdy: 18. 07. 2021, 11:23:49 »
Citace od: Filip Jirsák kdy 18. 07. 2021, 11:04:02
K očíslování vstupních elementů slouží <xsl:number />. Takže tam, kde potřebujete získat pořadové číslo, použijte <xsl:number count="Pack" select="XXX"/> kde za XXX dosadíte selektor pro uzel, jehož pořadí potřebujete získat – v případě palety to tedy bude aktuální uzel, v případě boxu to bude uzel získaný přes Parent.
Včera tady někdo xsl:number zmiňoval, díval jsem se, ale atribut 'select' se tam nezmiňuje:
https://www.w3schools.com/XML/ref_xsl_el_number.asp
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

  • *****
  • 1 140
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #20 kdy: 18. 07. 2021, 11:55:43 »
Citace od: ZAJDAN kdy 18. 07. 2021, 11:23:49
Citace od: Filip Jirsák kdy 18. 07. 2021, 11:04:02
K očíslování vstupních elementů slouží <xsl:number />. Takže tam, kde potřebujete získat pořadové číslo, použijte <xsl:number count="Pack" select="XXX"/> kde za XXX dosadíte selektor pro uzel, jehož pořadí potřebujete získat – v případě palety to tedy bude aktuální uzel, v případě boxu to bude uzel získaný přes Parent.
Včera tady někdo xsl:number zmiňoval, díval jsem se, ale atribut 'select' se tam nezmiňuje:
https://www.w3schools.com/XML/ref_xsl_el_number.asp

To jsem byl já. Tady je malá sbírka použití:
https://www.oreilly.com/library/view/xslt-2nd-edition/9780596527211/ch04s03.html
Atribut select tam skutečně není, ale jsou tam atributy from a value, které plní tuto funkci.

ZAJDAN

  • *****
  • 2 110
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #21 kdy: 18. 07. 2021, 12:05:01 »
Citace od: Kit kdy 18. 07. 2021, 11:55:43
To jsem byl já. Tady je malá sbírka použití:
https://www.oreilly.com/library/view/xslt-2nd-edition/9780596527211/ch04s03.html
Atribut select tam skutečně není, ale jsou tam atributy from a value, které plní tuto funkci.
Každopádně pokud jsem to dobře pochopil, tak uvnitř for-each nemůžu odkazovat na XML elementy, které v něm vznikají, ale musím se odkazovat na vstupní XML strukturu kterou má cyklus v selektu. V mém případě bych tedy v xsl:number ukazoval na ResultSet/Row, etc a to mi asi nepomůže.
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.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #22 kdy: 18. 07. 2021, 13:26:24 »
Citace od: ZAJDAN kdy 18. 07. 2021, 11:23:49
Včera tady někdo xsl:number zmiňoval, díval jsem se, ale atribut 'select' se tam nezmiňuje:
https://www.w3schools.com/XML/ref_xsl_el_number.asp
Když píšu o XSLT, myslím tím aktuální specifikaci XSLT 3.0. Clickbaitové weby jako w3schools nemá smysl zmiňovat, stejně jako 14 let starou knihu. Nejlepší je použít dokumentaci Saxonu – xsl:number. Asi nepoužíváte žádný proprietární XSLT procesor, takže stejně používáte Saxon, ve světě OSS není jiná alternativa, která by se Saxonu alespoň blížila.

Citace od: ZAJDAN kdy 18. 07. 2021, 12:05:01
Každopádně pokud jsem to dobře pochopil, tak uvnitř for-each nemůžu odkazovat na XML elementy, které v něm vznikají
Nejen uvnitř for-each. Obecně se nikde v XSLT nemůžete odkazovat ani na výstup ani na nějaký vámi definovaný dynamický stav. XSLT je záměrně dělané tak, aby v něm neexistoval žádný uživatelem definovaný stav.

Dá se udělat to, že výstup XSLT transformace proženete další transformací (klidně i v rámci jedné šablony), ale je to komplikace, efektivita zpracování tím dostává na frak.

Citace od: ZAJDAN kdy 18. 07. 2021, 12:05:01
ale musím se odkazovat na vstupní XML strukturu kterou má cyklus v selektu. V mém případě bych tedy v xsl:number ukazoval na ResultSet/Row, etc a to mi asi nepomůže.
Vždyť jsem to ukazoval, že xsl:number může odkazovat přímo na Pack. Pomocí atributu count si necháte očíslovat všechny uzly Pack, pomocí select si pak jen vyzvednete číslo konkrétního Packu.

ZAJDAN

  • *****
  • 2 110
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #23 kdy: 18. 07. 2021, 13:31:19 »
Citace od: Filip Jirsák kdy 18. 07. 2021, 13:26:24
...
1) Celá ta věc používá XSLT 1.0 (SAP IntegrationFramework 2.0)
2) Píšete, že se nemohu odkazovat na dynamicky vznikající obsah a následně píšete, že se mohu odkazovat na Pack, ale právě ten Pack v ten moment dynamicky vzniká.
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.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #24 kdy: 18. 07. 2021, 13:35:32 »
Citace od: Kit kdy 18. 07. 2021, 11:55:43
Atribut select tam skutečně není, ale jsou tam atributy from a value, které plní tuto funkci.
from a value mají úplně jinou funkci – slouží pro víceúrovňové číslování, kdybyste chtěl třeba číslovat jako ,,Kapitola 14.3".

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #25 kdy: 18. 07. 2021, 13:41:45 »
Citace od: ZAJDAN kdy 18. 07. 2021, 13:31:19
Celá ta věc používá XSLT 1.0 (SAP IntegrationFramework 2.0)
Tak to teda hodně štěstí... Nicméně atribut count pro xsl:number je už v XSLT 1.0, takže by to mohlo jít. Není tam atribut select, takže když nepoužijete value, vztahuje se k aktuálnímu uzlu, ale to by nemusel být problém.

Citace od: ZAJDAN kdy 18. 07. 2021, 13:31:19
Píšete, že se nemohu odkazovat na dynamicky vznikající obsah a následně píšete, že se mohu odkazovat na Pack, ale právě ten Pack v ten moment dynamicky vzniká.
To jsem asi popletl ty příklady tady. Odkazovat se můžete jen na vstupní dokument.

BoneFlute

  • *****
  • 2 155
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #26 kdy: 18. 07. 2021, 14:59:08 »
Citace od: ZAJDAN kdy 18. 07. 2021, 10:36:03
Palety iterují jen na sobě, boxy jen v jednom kole.
Počítá mi to takto:
<Pack>
<Type>Pallet</Type>
<ID>11</ID>
<Sequence>1</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>aaa</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>bbb</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>10</ID>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ccc</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ddd</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>6</ID>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>zzz</Child>
<Parent>3</Parent>
<Sequence>4</Sequence>
</Pack>


Předpokládám, že jsi si ověřil, že tam máš správný kód a nedošlo k nějaké chybě při přepisu nebo něco podobného, takže mě zajímá: Co za nástroj to zpracovává? Zkoušel jsem Xalan, zkoušel jsem https://xslttest.appspot.com/, tudíž za mě to považuji za vyřešené.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #27 kdy: 18. 07. 2021, 15:26:51 »
Citace od: BoneFlute kdy 18. 07. 2021, 14:59:08
tudíž za mě to považuji za vyřešené.
Ty vaše příklady jsou krásná ukázka toho, že lidé často píšou pořád v jednom programovacím jazyce, bez ohledu na to, jakou syntaxi zrovna používají. Ten váš příklad je C, nebo Python, nebo jakýkoli imperativní jazyk, akorát napsaný pomocí XSLT syntaxe.

BoneFlute

  • *****
  • 2 155
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #28 kdy: 18. 07. 2021, 15:59:03 »
Citace od: Filip Jirsák kdy 18. 07. 2021, 15:26:51
Citace od: BoneFlute kdy 18. 07. 2021, 14:59:08
tudíž za mě to považuji za vyřešené.
Ty vaše příklady jsou krásná ukázka toho, že lidé často píšou pořád v jednom programovacím jazyce, bez ohledu na to, jakou syntaxi zrovna používají. Ten váš příklad je C, nebo Python, nebo jakýkoli imperativní jazyk, akorát napsaný pomocí XSLT syntaxe.

Mýlíš se, jako vždy, ale to nevadí.

Kit

  • *****
  • 1 140
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #29 kdy: 18. 07. 2021, 16:10:31 »
Citace od: BoneFlute kdy 18. 07. 2021, 15:59:03
Citace od: Filip Jirsák kdy 18. 07. 2021, 15:26:51
Citace od: BoneFlute kdy 18. 07. 2021, 14:59:08
tudíž za mě to považuji za vyřešené.
Ty vaše příklady jsou krásná ukázka toho, že lidé často píšou pořád v jednom programovacím jazyce, bez ohledu na to, jakou syntaxi zrovna používají. Ten váš příklad je C, nebo Python, nebo jakýkoli imperativní jazyk, akorát napsaný pomocí XSLT syntaxe.

Mýlíš se, jako vždy, ale to nevadí.

Nemýlí se. XSLT se fakt používá jinak.