XSL podmíněný foreach

fos4

Re:XSL podmíněný foreach
« Odpověď #15 kdy: 29. 08. 2023, 12:34:29 »
Příklad s "if", sedí to?

https://xsltfiddle.liberty-development.net/6r5EJSU/20

Kód: [Vybrat]
<xsl:for-each select="ResultSet/Row">
  <xsl:if test="not(preceding-sibling::Row[current()/ItemCode=ItemCode])">
    <xsl:copy-of select="." />
  </xsl:if>
</xsl:for-each>


fos4

Re:XSL podmíněný foreach
« Odpověď #16 kdy: 29. 08. 2023, 13:36:08 »
Nebo přímo ve for-each:

https://xsltfiddle.liberty-development.net/6r5EJSU/21

Kód: [Vybrat]
<xsl:for-each select="ResultSet/Row[not(preceding-sibling::Row/ItemCode=ItemCode)]">
  <xsl:copy-of select="." />
</xsl:for-each>

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #17 kdy: 29. 08. 2023, 13:44:10 »
Nebo přímo ve for-each:
https://xsltfiddle.liberty-development.net/6r5EJSU/21
.... 
super...pracovat s for-each je pro mě jednoduší
práce se šablonami je velice zajímavá, ale přiznám se...moc je nechápu i když se snažím.
Díky panu Jirsákovi jsem konečně překročil práh a konečně s nimi udělal první krůček.
Pokusím se docílit výsledku oběma způsoby (for-each, template)
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.

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #18 kdy: 29. 08. 2023, 14:15:59 »
pomocí toho IF current() to funguje, ale problém bude získat výsledné indexi(řádky splňující podmínku)
a stejně tak z 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.

fos4

Re:XSL podmíněný foreach
« Odpověď #19 kdy: 29. 08. 2023, 14:27:59 »
Počkat.. vy chcete udělat jen group by Row/ItemCode a následně projete všechny ItemCode? postupně?


ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #20 kdy: 29. 08. 2023, 14:38:14 »
Počkat.. vy chcete udělat jen group by Row/ItemCode a následně projete všechny ItemCode? postupně?

position() počítá indexi ze vstupu na kterém se cykluje já ale potřebuju počítat indexi na výstupu, který vznikne na základě splněných podmínek
https://xsltfiddle.liberty-development.net/6r5EJSU/23
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:XSL podmíněný foreach
« Odpověď #21 kdy: 29. 08. 2023, 14:50:11 »
Doplním, že pro tyto případy lze použít funkci current(), která kontext určí přesně.
No jo, jenže ta je zase dostupná až od XPath 2.0, tedy XSLT 2.0. XSLT 2.0 přineslo oproti XSLT 1.0 právě spoustu věcí, které umožňují složitější zpracování dat v jednom průchodu. Když je omezení na použití XSLT 1.0, je to jak mít jednu ruku za zády.

super...pracovat s for-each je pro mě jednoduší
Pro vás ano, ale XSLT procesoru tím podrážíte nohy, protože pak nemůže kód moc optimalizovat. apply-templates je deklarativní, říkáte tím co se má udělat a je na XSLT procesoru, jak to udělá. for-each je imperativní, říkáte jak se to má udělat a XSLT procesoru nezbývá nic jiného, než to udělat tak, jak jste předepsal – i když by to třeba šlo jinak lépe. Je to stejné jako u SQL. Ale je pravda, že u XSLT 1.0 procesoru to s optimalizacemi asi nebude žádná sláva.

fos4

Re:XSL podmíněný foreach
« Odpověď #22 kdy: 29. 08. 2023, 14:53:25 »
current() má i XSLT 1.

Jinak lze celý výstup zabalit do proměnné a pak projet for-eachem. Nevím jak to má Saxon, tam se zdá to funguje by-default, jinak použít node-set()

https://xsltfiddle.liberty-development.net/6r5EJSU/24

Na rychlost ohledně for-each VS apply-templates se musím podívat, jak to vychází..apply templates právě moc nepoužíváme (ale máme malé XMLka), někde by se to mohlo hodit...
« Poslední změna: 29. 08. 2023, 14:55:02 od fos4 »

Re:XSL podmíněný foreach
« Odpověď #23 kdy: 29. 08. 2023, 14:55:28 »
Tak se mi to povedlo. Musel jsem do šablony 2 přidat generování elementu který porovnávám v cyklu.
https://xsltfiddle.liberty-development.net/6r5EJSU/19

V šabloně kopírující atributy máte navíc mode="index", ale žádnou šablonu s módem index tam nemáte.

Kód: [Vybrat]
<xsl:apply-templates select="@*" mode="index"/>
Nicméně na elementu Packaging stejně žádné atributy nemáte, takže to kopírování atributů je tam zbytečné. Dal jsem to tam jen pro úplnost, nevěděl jsem, zda tam nějaké atributy nebudete mít.

Re:XSL podmíněný foreach
« Odpověď #24 kdy: 29. 08. 2023, 15:07:56 »
current() má i XSLT 1.
A jo – vycházel jsem z dokumentace Saxonu, a neuvědomil jsem si, že ten už má jen režim kompatibility s XSLT 1.0 a v dokumentaci uvádí podporu až od XSLT 2.0.