Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: ZAJDAN 30. 09. 2021, 18:22:18
-
Ahoj,
mam XML výstup:
XML:
<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:
<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
-
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.
-
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.
-
Na spočítání počtu prvků v sekvenci slouží funkce count().
-
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.
<xsl:variable name="SequenceCounter">
<xsl:value-of select="count(
/vpf:Msg/vpf:Body/vpf:Payload[@id='CallSQL']/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>
-
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.
-
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
-
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.