XSLT 1.0 - Distinct

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
XSLT 1.0 - Distinct
« kdy: 30. 09. 2021, 18:22:18 »
Ahoj,
mam XML výstup:

XML:
Kód: [Vybrat]
<ResultSet rowCount="8">
    <Row>
        <Parent-LU-MG/>
        <CatalogNumber>222222</CatalogNumber>
        <DespatchedQty>100.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG/>
        <CatalogNumber>222222</CatalogNumber>
        <DespatchedQty>200.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG/>
        <CatalogNumber>777777</CatalogNumber>
        <DespatchedQty>300.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG/>
<CatalogNumber>888888</CatalogNumber>
        <DespatchedQty>300.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG/>
        <CatalogNumber>888888</CatalogNumber>
        <DespatchedQty>300.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG/>
        <CatalogNumber>888888</CatalogNumber>
        <DespatchedQty>300.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG>704699</Parent-LU-MG>
        <CatalogNumber>ZZZZZZ</CatalogNumber>
        <DespatchedQty>156.000</DespatchedQty>
    </Row>
    <Row>
        <Parent-LU-MG>704699</Parent-LU-MG>
        <CatalogNumber>ZZZZZZ</CatalogNumber>
        <DespatchedQty>156.000</DespatchedQty>
    </Row>
</ResultSet>

V něm se snažím spočítat Distinct na základě třech podmínek viz níže.
Když si zobrazím výstup proměnné, vrací hodnotu 2, ale měla by být 4.

XSLT 1.0:

Kód: [Vybrat]
<xsl:variable name="DistinctCounter">
<xsl:for-each select="/jdbc:ResultSet/jdbc:Row
[
                                        jdbc:Parent-LU-MG=''
                                      and
                                        jdbc:CatalogNumber[not(.=preceding::*)]
                                      and
                                        jdbc:DespatchedQty[not(.=preceding::*)]
]">             
                                             
<xsl:if test="position()=last()">
xsl:value-of select="position()"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>

díky za dobré rady
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 1.0 - Distinct
« Odpověď #1 kdy: 30. 09. 2021, 18:43:24 »
Funkce position() vrací pořadí prvku v aktuálně procházené sekvenci. Element for-each nastavuje aktuálně procházenou sekvenci na to, co je určené atributem select. Vy si tedy vytvoříte sekvenci unikátních řádků a zjišťujete pozici v rámci této sekvence.

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT 1.0 - Distinct
« Odpověď #2 kdy: 30. 09. 2021, 18:50:06 »
Funkce position() vrací pořadí prvku v aktuálně procházené sekvenci. Element for-each nastavuje aktuálně procházenou sekvenci na to, co je určené atributem select. Vy si tedy vytvoříte sekvenci unikátních řádků a zjišťujete pozici v rámci této sekvence.
To je to, o co se snažím. Procházet pouze unikátní záznamy a poslední pozice by tedy měla být počet/součet unikátů.
Nechci ty unikáty vypsat, ale spočítat je.
« Poslední změna: 30. 09. 2021, 18:52:40 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 1.0 - Distinct
« Odpověď #3 kdy: 30. 09. 2021, 18:59:34 »
Na spočítání počtu prvků v sekvenci slouží funkce count().

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT 1.0 - Distinct
« Odpověď #4 kdy: 30. 09. 2021, 19:31:35 »
Na spočítání počtu prvků v sekvenci slouží funkce count().
To byla první metoda, kterou jsem to zkoušel. Ale výsledek je 2 namísto 4. Někde dělám chybu.

Kód: [Vybrat]
<xsl:variable name="SequenceCounter">
   <xsl:value-of select="count(
                       /vpf:Msg/vpf:Body/vpf:Payload[@id=&apos;CallSQL&apos;]/jdbc:ResultSets/jdbc:ResultSet[2]/jdbc:Row
                       [
                          jdbc:Parent-LU-MG=''
                         and
                          jdbc:CatalogNumber[not(preceding::jdbc:CatalogNumber = .)]
                         and
                          jdbc:DespatchedQty[not(preceding::jdbc:DespatchedQty = .)]
                        ]
                                             )"/>
   </xsl:variable>
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 1.0 - Distinct
« Odpověď #5 kdy: 30. 09. 2021, 20:11:26 »
V takovémhle případě bývá užitečné si pomocí xsl:message vypsat, které elementy jsou vlastně v té kolekci.

Jinak v té podmínce asi chcete zjišťovat, zda ty elementy se stejnou hodnotou existují či neexistují. Normálně bych použil funkce exists() nebo empty(), ty jsou ale v XPath až od verze 2. Tak místo toho můžete porovnávat count() s nulou. Porovnání Parent-LU-MG s prázdným stringem je také divné, pokud chcete zjistit, zda je element prázdný, raději použijte count(jdbc:Parent-LU-MG/node()) eq 0.

ZAJDAN

  • *****
  • 2 047
    • Zobrazit profil
    • E-mail
Re:XSLT 1.0 - Distinct
« Odpověď #6 kdy: 30. 09. 2021, 20:39:44 »
V takovémhle případě bývá užitečné si pomocí xsl:message vypsat, které elementy jsou vlastně v té kolekci.

Jinak v té podmínce asi chcete zjišťovat, zda ty elementy se stejnou hodnotou existují či neexistují. Normálně bych použil funkce exists() nebo empty(), ty jsou ale v XPath až od verze 2. Tak místo toho můžete porovnávat count() s nulou. Porovnání Parent-LU-MG s prázdným stringem je také divné, pokud chcete zjistit, zda je element prázdný, raději použijte count(jdbc:Parent-LU-MG/node()) eq 0.
nechápu jak to myslíte, v tom příkladu víše count používám
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 1.0 - Distinct
« Odpověď #7 kdy: 01. 10. 2021, 09:36:40 »
Tohle jdbc:CatalogNumber[not(preceding::jdbc:CatalogNumber = .)] vrací elementy CatalogNumber, jejichž obsah se liší od všech předchozích elementů CatalogNumber. Vy ale v podmínce nechcete seznam těch elementů, chcete zjistit, jestli takový element existuje či neexistuje. Takže byste tam měl použít count(jdbc:CatalogNumber[not(preceding::jdbc:CatalogNumber = .)]) eq 0.