Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 30. 09. 2021, 18:22:18

Název: XSLT 1.0 - Distinct
Přispěvatel: ZAJDAN 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
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: Filip Jirsák 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.
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: ZAJDAN 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.
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: Filip Jirsák 30. 09. 2021, 18:59:34
Na spočítání počtu prvků v sekvenci slouží funkce count().
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: ZAJDAN 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>
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: Filip Jirsák 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.
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: ZAJDAN 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
Název: Re:XSLT 1.0 - Distinct
Přispěvatel: Filip Jirsák 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.