46
Vývoj / Re:XSLT - xpath axes uvnitř cyklu
« kdy: 23. 07. 2021, 12:42:51 »Rádo se stalo. V čem byl problém?u jednoho elementu mi chyběl namespace
jdbc:Row
Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.
Rádo se stalo. V čem byl problém?u jednoho elementu mi chyběl namespace
a ne všechno tam funguje standardně.<xsl:template match="/">
<vpf:Msg>
<xsl:copy-of select="/vpf:Msg/@*"></xsl:copy-of>
<xsl:copy-of select="/vpf:Msg/vpf:Header"></xsl:copy-of>
<vpf:Body>
<xsl:copy-of select="/vpf:Msg/vpf:Body/*"></xsl:copy-of>
<vpf:Payload Role="X" id="{$atom}">
<xsl:call-template name="transform"></xsl:call-template>
</vpf:Payload>
</vpf:Body>
</vpf:Msg>
</xsl:template>
<xsl:template name="transform">
....
....
.....
<xsl:template match="/">
<Pack>
<xsl:apply-templates select="/vpf:Msg/vpf:Body/vpf:Payload[@id='CallSQL']/jdbc:ResultSets/jdbc:ResultSet[3]/jdbc:Row"></xsl:apply-templates>
</Pack>
</xsl:template>
</xsl:template>
....Zítra to s čistou hlavou znovu zkusím.
....Docela se stydím přiznat, že tento standardní přístup jsem při používání XSLT nevyužíval a všude používám for-each.
...1) Celá ta věc používá XSLT 1.0 (SAP IntegrationFramework 2.0)
To jsem byl já. Tady je malá sbírka použití:Každopádně pokud jsem to dobře pochopil, tak uvnitř for-each nemůžu odkazovat na XML elementy, které v něm vznikají, ale musím se odkazovat na vstupní XML strukturu kterou má cyklus v selektu. V mém případě bych tedy v xsl:number ukazoval na ResultSet/Row, etc a to mi asi nepomůže.
https://www.oreilly.com/library/view/xslt-2nd-edition/9780596527211/ch04s03.html
Atribut select tam skutečně není, ale jsou tam atributy from a value, které plní tuto funkci.
K očíslování vstupních elementů slouží <xsl:number />. Takže tam, kde potřebujete získat pořadové číslo, použijte <xsl:number count="Pack" select="XXX"/> kde za XXX dosadíte selektor pro uzel, jehož pořadí potřebujete získat – v případě palety to tedy bude aktuální uzel, v případě boxu to bude uzel získaný přes Parent.Včera tady někdo xsl:number zmiňoval, díval jsem se, ale atribut 'select' se tam nezmiňuje:
<Pack>
<Type>Pallet</Type>
<ID>11</ID>
<Sequence>1</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>aaa</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>bbb</Child>
<Parent>1</Parent>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>10</ID>
<Sequence>2</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ccc</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>ddd</Child>
<Parent>2</Parent>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Pallet</Type>
<ID>6</ID>
<Sequence>3</Sequence>
</Pack>
<Pack>
<Type>Box</Type>
<Child>zzz</Child>
<Parent>3</Parent>
<Sequence>4</Sequence>
</Pack>
....Díky zkusil jsem, ale Sekvence je počítána špatně.
<Workbook>
<Pack>
<Type>Pallet<Type>
<ID>11</ID>
<Sequence>1</Sequence>
</Pack>
<Pack>
<Type>Box<Type>
<ID>aaa</ID>
<Sequence>2</Sequence>
<Parent>1</Parent>
</Pack>
<Type>Box<Type>
<ID>bbb</ID>
<Sequence>3</Sequence>
<Parent>1</Parent>
</Pack>
<Pack>
<Type>Pallet<Type>
<ID>10</ID>
<Sequence>4</Sequence>
</Pack>
<Pack>
<Type>Box<Type>
<ID>ccc</ID>
<Sequence>5</Sequence>
<Parent>4</Parent>
</Pack>
<Type>Box<Type>
<ID>ddd</ID>
<Sequence>6</Sequence>
<Parent>4</Parent>
</Pack>
<Type>Pallet<Type>
<ID>6</ID>
<Sequence>7</Sequence>
</Pack>
<Pack>
<Type>Box<Type>
<ID>zzz</ID>
<Sequence>8</Sequence>
<Parent>7</Parent>
</Pack>
</Workbook>
<ResultsSet>
<ResultSet>
<Row><Parent>11</Parent></Row>
<Row><Parent>10</Parent></Row>
<Row><Parent>6</Parent></Row>
</ResultSet>
<ResultSet>
<Row>
<Child>aaa</Child>
<Parent>11</Parent>
</Row>
<Row>
<Child>bbb</Child>
<Parent>11</Parent>
</Row>
<Row>
<Child>ccc</Child>
<Parent>10</Parent>
</Row>
<Row>
<Child>ddd</Child>
<Parent>10</Parent>
</Row>
<Row>
<Child>zzz</Child>
<Parent>6</Parent>
</Row>
</ResultSet>
</ResultsSet>
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
<xsl:variable name="Parent" select="/ResultsSet/ResultSet[1]/Row/Parent"></xsl:variable>
<Pack>
<Type>Pallet<Type>
<ID><xsl:value-of select="Parent"/></ID>
<Sequence><xsl:value-of select="position()"></Sequence>
</Pack>
<xsl:for-each select="/ResultsSet/ResultSet[2]/Row[Parent='$Parent']">
<Pack>
<Type>Box<Type>
<ID><xsl:value-of select="Child"></ID>
<Sequence><xsl:value-of select="position() +1"></Sequence>
<Parent>sekvenční číslo rodičovské palety</Parent>
</Pack>
</xsl:for-each>
Měl jsem na mysli vstupní XML. Mám si ho snad vycucat z prstu?
<ResultsSet>
<ResultSet>
<Row><Parent>11</Parent></Row>
<Row><Parent>10</Parent></Row>
<Row><Parent>6</Parent></Row>
</ResultSet>
<ResultSet>
<Row>
<Child>aaa</Child>
<Parent>11</Parent>
</Row>
<Row>
<Child>bbb</Child>
<Parent>11</Parent>
</Row>
<Row>
<Child>ccc</Child>
<Parent>10</Parent>
</Row>
<Row>
<Child>ddd</Child>
<Parent>10</Parent>
</Row>
<Row>
<Child>zzz</Child>
<Parent>6</Parent>
</Row>
</ResultSet>
</ResultsSet>
<xsl:for-each select="/ResultsSet/ResultSet[1]/Row">
<xsl:variable name="Round" select="position()"></xsl:variable>
<Pack>
<Parent>Pallet</Parent>
<ID><xsl:value-of select="Parent"/></Parent>
<xsl:choose>
<xsl:when test="$Round='1'">
<Number><xsl:value-of select="position()"></xsl:value-of></Number>
</xsl:when>
<xsl:otherwise>
<Number><xsl:value-of select="./ancestor::Pack/Number +1"></xsl:value-of></Number>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>S osama potřebuji pracovat až na nově vznikající xml struktuře uvnitř cyklu. Hodnota v elementu <Number> se bude měnit ještě na základě jiných podmínek, ale do toho nemá smysl zabředávat. Otazka zní, zda se pomocí xpath axes dá ukazovat na strukturu, která je vytvořena v předchozím kole cyklu.
Zkus zapomenout na existenci xsl:for-each a udělej to pořádně. Uvidíš, že to bude o dost jednodušší.XML struktura vzniká právě v tom cyklu foreach.
Dodej sem ukázku XML a požadovaný výsledek. Testovací data se mi vymejšlet nechce.
<xsl:for-each select="/bla/bla/bla/neco">
<xsl:variable name="Round" select="position()"></xsl:variable>
<Pack>
<Parent>Pallet</Parent>
<xsl:choose>
<xsl:when test="$Round='1'">
<Number><xsl:value-of select="position()"></xsl:value-of></Number>
</xsl:when>
<xsl:otherwise>
<Number><xsl:value-of select="./ancestor::Pack/Number +1"></xsl:value-of></Number>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
kup si 16core Ryzen, dej tam 64-128GB RAM, a nějakou nVidia GPU pro CUDA.souhlasím...sám pracuji ve Photoshopu i Illustratoru a na AMD to kmitá dobře.
Neposlouchej ty lidi s macbookama - ten výkon se nedá vůbec srovnat.