Re: Re: [xsl] lookup table problem

Subject: Re: Re: [xsl] lookup table problem
From: Alexander.RACHER@xxxxxxxx
Date: Mon, 24 Apr 2006 13:06:42 +0200
hi ken,

first of all thx for your answer.

>>   <seife>
>>      <at.sds.xc.reportService.ReportDaten>
>>         [...]
>>      <at.sds.xc.positionsreports.DaklOutput>
>>        <belegnummerList arraySize="1">
>>         [...]
>>        </belegnummerList>
>>        <depot>
>>         [...]
>>        </depot>
>>        <depotDaten>
>>         [...]
>>        </depotDaten>
>>        <verrechnungskonto>
>>         [...]
>>        </verrechnungskonto>
>>     <einzelPositionList arraySize="5">
>>      <element>
>>        <positionsDaten>
>>          <positSaldoGilt>19998</positSaldoGilt>
>>          <positVerwahrart>WR</positVerwahrart>
>>          <positLoco>DE</positLoco>
>>        [...]
>>
>>here is a part of the lookup table SVZ_1001.xml
>>
>><?xml version="1.0" encoding="ISO-8859-1"?>
>>
>><getTables>
>>  <at.sds.xc.coreService.CodeTableList arraySize="1">
>>    <element>
>>     <codeTableNo>1001</codeTableNo>
>>     <codeTableType>ALLG</codeTableType>
>>     <codeTableName>code-table-name</codeTableName>
>>     <codes arraySize="97">
>>        <element>
>>          <code>0000</code>
>>         <hcode/>
>>         <sysstatus>0</sysstatus>
>>         <codeText>Wien</codeText>
>>       </element>
>>        <element>
>>         [...]
>>
>>I need the  <codeText> (lookup) where   <positLoco> (source) equals
<code>
>>(lookup). so, the output should look like
>>Loco: Wien
>>(and not '0000').
>>
>>here is a part of my (wellformed) xsl (template will be called within
>>fo:root):
>>


<?xml version="1.0" encoding="ISO-8859-1"?>



<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"; xmlns:fo="
http://www.w3.org/1999/XSL/Format";>
        <xsl:output method="xml" omit-xml-declaration="yes"/>



        <xsl:decimal-format
separator=","
separator="."
separator=";"
sign="-"
="nummer">
        </xsl:decimal-format>

        <xsl:variable name="leer"/>


        <xsl:template match="/">
                <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
                        <fo:layout-master-set>



                                <fo:simple-page-master master-name="
blattA4"
                        height="297mm"
                        width="210mm"
                        left="1cm"
                        right="1cm"
                        top="1cm"
                        bottom="1cm">
                                        <fo:region-body margin-top="4cm"
margin-bottom="3.5cm">
                                                <!-- margin-left="1.5cm"
margin-right="2.5cm" !-->
                                        </fo:region-body>
                                        <fo:region-before extent="4cm"/>
                                        <fo:region-after extent="2cm"/>
                                        <!--fo:region-start
extent="0.5cm"></fo:region-start!-->
                                        <!--fo:region-end
extent="1.5cm"></fo:region-end!-->
                                </fo:simple-page-master>
                        </fo:layout-master-set>
                        <fo:page-sequence master-reference="blattA4">



                        <fo:static-content flow-name="xsl-region-before">



                <fo:block>
                        <xsl:call-template name="Kundenheader"/>
                </fo:block>

                        <fo:list-block>
                                <fo:list-item>
                                        <fo:list-item-label
                                indent="8.5cm">
                                                <fo:block>
                                                <fo:external-graphic src="
geos.jpg"/></fo:block>
                                        </fo:list-item-label>
                                        <fo:list-item-body max-width="
12.2cm"
                                indent="11.8cm">
                                                <fo:blockalign="start">
                                                <xsl:call-template name="
Belegkopf"/></fo:block>
                                        </fo:list-item-body>
                                </fo:list-item>
                        </fo:list-block>

                        </fo:static-content>



                                <fo:static-content flow-name="
xsl-region-after">
                                        <fo:block font-size="8pt"><
xsl:call-template name="Footer"></xsl:call-template>
                                        </fo:block>
                                </fo:static-content>


                                <fo:flow flow-name="xsl-region-body">


                                        <fo:block>
                                                <xsl:call-template name="
Adresse"></xsl:call-template>
                                        </fo:block>

                                        <fo:block font="Helvetica"
                                size="10pt"
                                option="wrap">
                                                <xsl:call-template name="
Mandtext"></xsl:call-template>
                                        </fo:block>

                                        <fo:block text-align="center"
                                ="Helvetica"
                                size="10pt"
                                option="wrap">
                                                <xsl:call-template name="
AllgDaten"></xsl:call-template>
                                        </fo:block>




                                        <fo:block padding-before="1cm"
font="Helvetica">
                                                <xsl:call-template name="
Posit"></xsl:call-template>
                                        </fo:block>

[...]
                                </fo:flow>
                        </fo:page-sequence>
                </fo:root>
        </xsl:template>

<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::-->
<!-- Generierung der Inhalte-->
<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::-->


<!-- Generierung Kundenheader-->

        <xsl:template name="Kundenheader">
                <fo:block white-space-treatment="preserve"
        treatment="preserve"
        size="8pt"
        align="left">
                        <xsl:for-each select="
//at.sds.xc.reportService.ReportDaten/belegBereiche/inhaltsListe/element">
                        <xsl:choose>
                                <xsl:when test="./belegBereich = 'KOPF'">
                                        <xsl:value-of select="
./textListe/element/inhalt"/>
                                </xsl:when>
                        </xsl:choose>
                        </xsl:for-each>
                </fo:block>
        </xsl:template>


<!-- Generierung Belegkopf             -->

        <xsl:template name="Belegkopf">
                <fo:block
        ="Helvetica"
        size="10pt"
        color="#9ECCFA"
        option="no-wrap"
        before="0.3cm">

                <!-- Belegbezeichnung             -->


                        <fo:block font-weight="bold">

                <xsl:variable name="belegBereich" select="
//inhaltsListe//belegBereich[. ='BBEZ']"></xsl:variable>
                <xsl:choose>
                        <xsl:when test="$belegBereich">
                                <xsl:value-of select="
$belegBereich/../textListe/element/inhalt"/>
                        </xsl:when>

                        <xsl:otherwise>
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/bezeichnung">
                                </xsl:value-of>
                        </xsl:otherwise>
                </xsl:choose>


                        </fo:block>


        <!-- Auszug-Nr., laufende Nummer, laufendes Jahr, Duplikat?
fixTexte kvnnten auch wie bei Duplikat direkt codiert werden, dann wdre
choose nicht notwendig         -->

                        <fo:block>
                        <xsl:for-each select="
//at.sds.xc.reportService.ReportDaten/fixTexte/element">
                        <xsl:choose>
                                <xsl:when test="./fixfmNr = '19'">
                                        <xsl:value-of select="
./textInhalte/element/fixText"/><xsl:text> </xsl:text>
                                        <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/belegnummerList/element/laufendeNumme
r
"/> /
                                        <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/belegnummerList/element/laufendesJahr
"/><xsl:text> </xsl:text>
                                        <xsl:if test="//adressen//original
='false' or //depot/nachdruck = 'true'"> D U P L I K A T        </xsl:if>
                                </xsl:when>
                        </xsl:choose>
                        </xsl:for-each>
                </fo:block>



                <!-- Depotnummer             -->

                        <fo:block>Depot-Nr.:
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/nummer">
                                </xsl:value-of>
                        </fo:block>

                <!-- Depotbezeichnung 1            -->

                        <fo:block>
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/bezeichnung1"></xsl:value-of
>
                        </fo:block>

                <!-- Depotbezeichnung 2            -->

                        <fo:block>
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/bezeichnung2"></xsl:value-of
>
                        </fo:block>

                <!-- OE / Stelle / Kurzbezeichnung   -->

                        <fo:block>Betreuer:
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/orgehCode"></xsl:value-of><
xsl:text> </xsl:text>
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/orgehKurzbezeichn"></
xsl:value-of> /
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depot/betreuendeStelle"></
xsl:value-of>
                        </fo:block>


                </fo:block>

        </xsl:template>


<!-- Generierung Adresse             -->

        <xsl:template name="Adresse">
                <fo:block
        space-treatment="preserve"
        treatment="preserve"
        ="Helvetica"
        size="10pt"
        indent="12cm">
                        <xsl:value-of select="
//at.sds.xc.reportService.ReportDaten/adressen/element/adresse"/>
                </fo:block>
        </xsl:template>


<!-- Generierung Mandantentext             -->

        <xsl:template name="Mandtext">
        <fo:block white-space-treatment="preserve"
        treatment="preserve"
        align="left"
        before="2cm">
                        <xsl:for-each select="
//at.sds.xc.reportService.ReportDaten/belegBereiche/inhaltsListe/element">
                        <xsl:choose>
                                <xsl:when test="./belegBereich = 'MANF'">
                                        <xsl:value-of select="
./textListe/element/inhalt"/>
                                </xsl:when>
                        </xsl:choose>
                        </xsl:for-each>
                </fo:block>
        </xsl:template>

<!-- Generierung Allgemeine Daten (Aufstellungs|berschrift)
-->

        <!-- Aufstellung per 99.99.999 99:99 Uhr - Ausgabe Uhrzeit nur
wenn stichtabVon=stichtagBis            -->
<xsl:template name="AllgDaten">
                <fo:block
        before="1cm"
        weight="bold">AUFSTELLUNG per
                        <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/stichtagVon"/>
                        <xsl:if test="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/stichtagVon =
//at.sds.xc.positionsreports.DaklOutput/depotDaten/stichtagBis">
                                <xsl:text> </xsl:text>
                                <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/tageszeit"/>
                                        <xsl:text> Uhr</xsl:text>
                        </xsl:if>
                        </fo:block>

        <!-- Depottyp        Andruck nur bei Schattendepot     -->

                <fo:block font-weight="bold">
                        <xsl:if test="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/depotTyp = 'SCHA'">
Schattendepot</xsl:if>
                </fo:block>


        <!-- KESTfrei?             Andruck nur bei 'true'  -->

                <fo:block>
                        <xsl:if test="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/kestFrei = 'true'">
Dieses Depot ist KEST-frei.</xsl:if>
                        </fo:block>


        <!-- Sperre vorhanden?    Andruck nur bei 'true'         -->

                <fo:block>
                        <xsl:if test="
//at.sds.xc.positionsreports.DaklOutput/depotDaten/sperre = 'true'">Dieses
Depot ist mit einer Sperre belegt.</xsl:if>
                        </fo:block>


        <!-- Standardverrechnungskonto, WHG, BLZ  -->

                <fo:block>
                : <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/verrechnungskonto/kontonummer"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/verrechnungskonto/waehrung"/>
                        <xsl:text> </xsl:text>
                        <xsl:if test="/dakl//bankleitzahl != ''">
                .: <xsl:value-of select="
//at.sds.xc.positionsreports.DaklOutput/verrechnungskonto/bankleitzahl"/>
                        </xsl:if>
                </fo:block>

        </xsl:template>

>><xsl:template name="Posit">
>>         <xsl:choose>
>>                 <xsl:when test="//einzelPositionList">
>
>Is it true that your instance always has such a list?  You don't
>indicate what your current node is at the time of doing this
>test.  And you are probably inappropriately using "//" here, but I
>cannot tell for sure.
>

first of all i already read some articles about using "//" (i think some
of them were from you in the list), so i tried using the xsl without, but
then the template produced no output at all (maybe another mistake in my
code???).

i'm not quite sure what you mean with "Is it true that your instance
always has such a list?". since all information for this part of my xml
are child-nodes of <einzelPositionList arraySize="5"> i think the answer
is YES.

sorry, but since i'm a newbie with xsl i can't tell what the current node
is - i expect "einzelPositionList/element" to be the current node, since
"./positionsDaten/..." delivers the date i expect.
i tried not to send every line of code of my xsl to the list, since it
already is over 500 lines long. i pasted more code right before
<xsl:template name="Posit"> - the variable 'leer' is also defined at the
beginning (actually an empty variable to test against elements without any
value).




>>                         <fo:table table-omit-header-at-break="false"
>>table-layout="fixed" border-collapse="separate" font-size="8pt" width="
>>100%">
>>                         <fo:table-column column-width="35mm"/>
>>                         <fo:table-column column-width="10mm"/>
>>                         <fo:table-column column-width="90mm"/>
>>                         <fo:table-column column-width="30mm"/>
>>                         <fo:table-column column-width="25mm"/>
>>
>>                         <fo:table-header>
>>                                 [...]
>>                         </fo:table-header>
>>                         <fo:table-body>
>>                                 <xsl:for-each select="
>>//einzelPositionList/element">
>>                                         <fo:table-row>
>>                                         <xsl:choose>
>>                                                 <xsl:when test="
>>(position() mod 2) = 0">#ffffff</xsl:when>
>> <xsl:otherwise>#9ECCFA</
>>xsl:otherwise>
>>                                         </xsl:choose>
>>                                         </xsl:attribute>
>>                                         <fo:table-cell>
>>                                                 [...]
>>                                         </fo:table-cell>
>>                                         <fo:table-cell>
>>                                                 [...]
>>                                         </fo:table-cell>
>>                                         <fo:table-cell>
>><fo:block>
>>         <xsl:variable name="loco-svz" select="
>>document('SVZ_1001.xml')//codes/element = //positDaten/positLoco"/>
>
>Your use of "//" is both wasteful (execution wise) and inappropriate
>in the above comparison, as the result is not a node set, it is a
>boolean (which is what you are reading in your error message).
>
>You probably need a predicate something like:
>
>document('SVZ_1001.xml')//codes
>               [element = current()/element/positDaten/positLoco]"
>
>But, unfortunately, you don't give enough of your code, and your
>constant jumping back to the root using "//" is probably losing your
>context for the purposes of efficient testing and navigation.


as already written above, if i don't use "//" the template doesn't return
any data in the output-document. i tried your suggestion regarding the
predicate, unfortunately no output is generated by this statement:
                                                        <fo:table-cell
padding-after="5mm">
                                                                <fo:block
padding-before="3mm+10pt"> </fo:block>
                                                                <fo:block
font-weight="bold">Austrian Airlines Vsterr. Luftverke</fo:block>
                                                                <fo:block>
hrs AG Stammaktie</fo:block>
                                                                <fo:block>
Kup. 2 </fo:block>
                                                                <fo:block>
Loco: </fo:block>
                                                                <fo:block
/>
                                                                <fo:block
/>
                                                                <fo:block
/>
                                                                <fo:block
/>
                                                        </fo:table-cell>


>
>>         <xsl:if test="normalize-space(./positionsDaten/positLoco) !=
$leer
>>">
>
>You don't show the setting of the variable $leer, so I'm not sure how
>this helps.

it's an empty variable - see above.

>
>>fop - message:
>>Exception
>>org.apache.xpath.XPathException: #BOOLEAN kann nicht in NodeList
>>konvertiert werden!
>>(means: boolean can not be coverted into nodelist)
>
>Right ... because you were initializing your variable to the result
>of a comparison operator ... not a selection of a qualified node list.
>
>>how do i need to write my xsl to get things working as i expect?
>>
>Probably quite a few changes are needed.
>
>I tell my students "if you think you need "//" then think again ...
>you probably don't ... which isn't to say it is evil, just that it
>has its role and it is too often abused".
>
>I hope this helps.
>
>. . . . . . . . . Ken

again, when writing my xsl, i never ignored this issue with jumping back
to the root node. at first, i addressed every node with an absolute path
(from the root-node to node i need to be processed), then i substituted
the abolute path with "//" to make the code more readable. any try to drop
"//" resulted in no output.
i hope the additional code i pasted above helps you helping me ;o]

cheers
alex


______________________________________________________________________
Der Austausch von Nachrichten mit Software Daten Service via E-Mail dient
ausschliesslich Informationszwecken. Rechtsgeschaeftliche Erklaerungen duerfen
ueber dieses Medium nicht ausgetauscht werden.

Correspondence with Software Daten Service via e-mail is only for information
purposes. This medium is not to be used for the exchange of legally-binding
communications.

Current Thread