XSL podmíněný foreach

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
XSL podmíněný foreach
« kdy: 25. 08. 2023, 12:04:30 »
Ahoj....
potřebuji v XSLT 1.0
vybrat řádky, které nemají předcházející dvojče se stejnou hodnotou v daném elementu.
https://xsltfiddle.liberty-development.net/6r5EJSU/2

Mělo by to vybrat dva řádky, ale vybere se jen jeden.
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ěď #1 kdy: 25. 08. 2023, 13:13:04 »
V XSLT se pokud možno nepoužívá for-each, ale použije se apply-templates.

Porovnání ItemCode=ItemCode je zjevně nesmysl, XPath procesor nemůže vědět, že tím jednou myslíte ItemCode z kontextu před spuštěním XPath výrazu a podruhé ItemCode v rámci XPath výrazu.

Udělal bych to tak, že si vytvoříte šablonu na ResultSet/Row, v té si uložíte do proměnné hodnotu ItemCode, a pak zavoláte další šablonu, ve které budete mít tu vaši podmínku – a hodnotu předchozího záznamu budete porovnávat s tím, co máte uložené v proměnné. Přičemž ještě přidejte podmínku, že vás zajímá jenom první z předchozích záznamů (tj. za Row přidejte [1]) – tak, jak to máte teď, by se ta podmínka vyhodnotila, pokud by v kterémkoli z předchozích záznamů byla vámi hledaná hodnota.

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #2 kdy: 25. 08. 2023, 14:15:36 »
... a pak zavoláte další šablonu, ve které budete mít tu vaši podmínku – a hodnotu předchozího záznamu budete porovnávat s tím, co máte uložené v proměnné. Přičemž ještě přidejte podmínku, že vás zajímá jenom první z předchozích záznamů (tj. za Row přidejte [1]) – tak, jak to máte teď, by se ta podmínka vyhodnotila, pokud by v kterémkoli z předchozích záznamů byla vámi hledaná hodnota.
Vytvořil jsem tedy tu první šablonu. S tou druhou šablonou již netuším jak přesně to myslíte. Pomohl by jste mi prosím přímo v tom příkladu?
https://xsltfiddle.liberty-development.net/6r5EJSU/3

děkuji
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ěď #3 kdy: 25. 08. 2023, 14:26:56 »
už jse se posunul, ale musím si s tím více pohrát:
https://xsltfiddle.liberty-development.net/6r5EJSU/4
chápu Vás správně, že nebude for-each vůbec potřeba a všechno se udělá pomocí šablon a podmínek v selectu?
« Poslední změna: 25. 08. 2023, 14:28:42 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:XSL podmíněný foreach
« Odpověď #4 kdy: 25. 08. 2023, 19:12:48 »
XSLTfiddle mi teď hlásí 503… Ale to XSLT by snad mohlo vypadat takhle nějak:

Kód: [Vybrat]
<xsl:stylesheet version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  exclude-result-prefixes="#all" expand-text="yes">

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="ResultSet/Row" priority="10">
    <xsl:variable name="ItemCode" select="ItemCode" />
    <xsl:apply-templates select=".[not(preceding-sibling::Row[1][ItemCode=$ItemCode])]" />
  </xsl:template>
  <xsl:template match="ResultSet/Row" priority="5">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Kopíruje to požadované řádky do výstupu, vy s nimi asi místo copy budete chtít udělat něco jiného.


ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #5 kdy: 25. 08. 2023, 19:39:30 »
...
Kopíruje to požadované řádky do výstupu, vy s nimi asi místo copy budete chtít udělat něco jiného.
moc děkuji
zkouším, ale nevypíše to žádný řádek:
https://xsltfiddle.liberty-development.net/6r5EJSU/5
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ěď #6 kdy: 25. 08. 2023, 19:51:24 »
Jo, protože priority takhle nefunguje a next-match v XSLT 1.0 není. Tak takhle? https://xsltfiddle.liberty-development.net/6r5EJSU/6

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #7 kdy: 26. 08. 2023, 10:05:28 »
Jo, protože priority takhle nefunguje a next-match v XSLT 1.0 není. Tak takhle? https://xsltfiddle.liberty-development.net/6r5EJSU/6
Pane Jirsák moc děkuji za ukázku. Doplnil jsem do xpath select podmínky dle mé potřeby. Teď ale narážím na problém, že mi nepůjdou dosazovat indexi jako to lze například ve for-each pomocí position()
Existuje v šabloně způsob jak na to?
https://xsltfiddle.liberty-development.net/6r5EJSU/7
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ěď #8 kdy: 26. 08. 2023, 10:24:35 »
position() se počítá z aktuálního kontextu, tedy u šablony ze všech uzlů, které odpovídají selectu šablony. Předpokládám, že tam chcete pozici z té původní množiny – pak je potřeba ji získat hned v první šabloně a do té druhé šablony si ji poslat pomocí parametru: https://xsltfiddle.liberty-development.net/6r5EJSU/8

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #9 kdy: 26. 08. 2023, 11:03:11 »
...Předpokládám, že tam chcete pozici z té původní množiny...
Špatně jsem to napsal, potřeboval bych vypsat indexy z té selektované množiny. V tom příkladu to jsou 4 řádky.
Každopádně to co jste použil se mi také bude hodit.
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ěď #10 kdy: 26. 08. 2023, 13:01:07 »
Nenapadá mne, jak to s prostředky XSLT 1.0 udělat jinak, než druhým průchodem přes ty výsledné záznamy: https://xsltfiddle.liberty-development.net/6r5EJSU/10

ZAJDAN

  • *****
  • 2 087
    • Zobrazit profil
    • E-mail
Re:XSL podmíněný foreach
« Odpověď #11 kdy: 28. 08. 2023, 13:16:43 »
Nenapadá mne, jak to s prostředky XSLT 1.0 udělat jinak, než druhým průchodem přes ty výsledné záznamy: https://xsltfiddle.liberty-development.net/6r5EJSU/10
wooow...jste opravdu machr! moc moc děkuji
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ěď #12 kdy: 29. 08. 2023, 10:10:53 »
Nenapadá mne, jak to s prostředky XSLT 1.0 udělat jinak, než druhým průchodem přes ty výsledné záznamy: https://xsltfiddle.liberty-development.net/6r5EJSU/10
Dobrý den pane Jirsák,
pokouším se tu pozici z podmíněného selectu uloženou do proměnné index porovnávat zda je(lichá, sudá) s hodnotou v elementu, který generuju v jiné šabloně, ale právě v této jiné šabloně už ta proměnná není přístupná.
Napadá Vás jak by toho šlo dosáhnout?
https://xsltfiddle.liberty-development.net/6r5EJSU/17
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ěď #13 kdy: 29. 08. 2023, 11:56:47 »
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
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ěď #14 kdy: 29. 08. 2023, 12:22:39 »
Porovnání ItemCode=ItemCode je zjevně nesmysl, XPath procesor nemůže vědět, že tím jednou myslíte ItemCode z kontextu před spuštěním XPath výrazu a podruhé ItemCode v rámci XPath výrazu.

Doplním, že pro tyto případy lze použít funkci current(), která kontext určí přesně. Takže podmínka pak jde použít nějak takto:

ItemCode=current()/ItemCode

Používám běžne pro for-each, kdy chci rozlišit zda hodnota se vztahuje na data uvnitř for-eachu, nebo vně.