[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Re: lookup table problem
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.
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|