XSLT - xpath axes uvnitř cyklu

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #15 kdy: 18. 07. 2021, 01:06:48 »
....
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

  • *****
  • 1 981
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #16 kdy: 18. 07. 2021, 03:01:26 »
....
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:
Kód: [Vybrat]
<?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 078
    • Zobrazit profil
    • E-mail
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:
Kód: [Vybrat]
<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 »
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 078
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #19 kdy: 18. 07. 2021, 11:23:49 »
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

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #20 kdy: 18. 07. 2021, 11:55:43 »
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 078
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #21 kdy: 18. 07. 2021, 12:05:01 »
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 »
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.

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.

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.
« Poslední změna: 18. 07. 2021, 13:31:58 od Filip Jirsák »

ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #23 kdy: 18. 07. 2021, 13:31:19 »
...
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á.
« Poslední změna: 18. 07. 2021, 13:33:56 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.

Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #24 kdy: 18. 07. 2021, 13:35:32 »
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 »
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.

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

  • *****
  • 1 981
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #26 kdy: 18. 07. 2021, 14:59:08 »
Palety iterují jen na sobě, boxy jen v jednom kole.
Počítá mi to takto:
Kód: [Vybrat]
<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 »
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

  • *****
  • 1 981
    • Zobrazit profil
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #28 kdy: 18. 07. 2021, 15:59:03 »
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

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:XSLT - xpath axes uvnitř cyklu
« Odpověď #29 kdy: 18. 07. 2021, 16:10:31 »
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.