Announcement

Collapse
No announcement yet.

XML Datei mithilfe von XSLT in PDF umwandeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML Datei mithilfe von XSLT in PDF umwandeln

    Hallo, ich hätte ein Problem.
    Und zwar habe ich eine XML-Datei welche ich mithilfe einer XSL Datei automatisch in eine PDF-Datei umwandeln soll. Jetzt weiß ich aber nicht, wie ich Verknüpfungen zwischen gleichen Feldnummern herstellen kann.
    Als Beispiel:

    Code:
    <fields>
        <field tableshort="PR" tablename="Offer" fieldno="3" fieldname="SeqNo" fieldlabel="Angebotsnr." fieldlength="10" fieldtype="L" />
        <field tableshort="PR" tablename="Offer" fieldno="6" fieldname="Date" fieldlabel="Datum" fieldlength="10" fieldtype="D" />
    Hier soll jetzt in dieser Zeile nach dem fieldname="SeqNo" abgefragt werden, also aus der Zeile in der --> fieldname="SeqNo" vorkommt soll die tableshort="PR" und die fieldno="3" gemerkt werden (man kann nicht direkt nach der fieldno Abfragen, da diese sich im Gegensatz zu dem fieldname, bei einer anderen XML Datei, verändern kann.)

    Mit "PR" und "3" soll nun weiter unten in der XML Datei der auszugebende Wert ermittelt werden, aus einer Tabelle die wie folgt aussieht

    Code:
        <table tableshort="PR" recid="x00000001075bcd15" prefix="PR">
          <field fieldno="3" value="123456789">123456789</field>
          <field fieldno="6" value="20100505">05.05.2010</field>
          <field fieldno="10" value="20100505">05.05.2010</field>
          <field fieldno="12" value="17473.00">17.473,00</field>
          <field fieldno="13" value="16599.35">16.599,35</field>
          <field fieldno="14" value="598.50">598,50</field>
          <field fieldno="16" value="5.00">5,00%</field>
          <field fieldno="17" value="873.65">873,65</field>
    
    <table tableshort="AP" recid="x000000010000000f" prefix="PRAP">
              <field fieldno="2" value="1">1</field>
              <field fieldno="4">10900100000</field>
              <field fieldno="7" catNo="10" catval="43">Normal</field>
              <field fieldno="8" catNo="28" catval="5">Abfallbehälter</field>
              <field fieldno="10" value="3.00">3,00</field>
              <field fieldno="11" value="306.00">306,00</field>
              <field fieldno="13" />
              <field fieldno="17" value="918.00">918,00</field>
              <field fieldno="19" value="872.10">872,10</field>
    Die oberen Werte haben also alle den prefix "PR" es soll aber nur der Wert mit der fieldno="3" augegeben werde. Hier in diesem Beispiel --> 123456789.
    Wie ist dies zu realisieren?

    Ausserdem sollen die Ausgabewerte noch an einer bestimmten Stelle in der PDF Datei stehen

    Danke schonmal im vorraus

  • #2
    Der Weg XML -> PDF führt meist über XML -> XSLT -> XSL-FO -> PDF, Hilfe dazu musst du in http://entwickler-forum.de/forumdisplay.php?f=366 suchen.

    Was das Verarbeiten von Querverweisen angeht, das kann man effizient mit Hilfe von xsl: key lösen.
    Hier ein XSLT 2.0 Beispiel:
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      version="2.0">
      
      <xsl:param name="fn" select="'SeqNo'"/>
      
      <xsl:key name="k1" match="table" use="@tableshort"/>
      <xsl:key name="k2" match="table/field" use="@fieldno"/>
      
      <xsl:template match="/">
        <xsl:variable name="field" select="//fields/field[@fieldname = $fn]"/>
        <xsl:value-of select="key('k2', $field/@fieldno, key('k1', $field/@tableshort))"/>
      </xsl:template>
      
    </xsl:stylesheet>
    Mit der Eingabe
    Code:
    <root>
    
    <fields>
        <field tableshort="PR" tablename="Offer" fieldno="3" fieldname="SeqNo" fieldlabel="Angebotsnr." fieldlength="10" fieldtype="L" />
        <field tableshort="PR" tablename="Offer" fieldno="6" fieldname="Date" fieldlabel="Datum" fieldlength="10" fieldtype="D" />
    </fields>
    
        <table tableshort="PR" recid="x00000001075bcd15" prefix="PR">
          <field fieldno="3" value="123456789">123456789</field>
          <field fieldno="6" value="20100505">05.05.2010</field>
          <field fieldno="10" value="20100505">05.05.2010</field>
          <field fieldno="12" value="17473.00">17.473,00</field>
          <field fieldno="13" value="16599.35">16.599,35</field>
          <field fieldno="14" value="598.50">598,50</field>
          <field fieldno="16" value="5.00">5,00%</field>
          <field fieldno="17" value="873.65">873,65</field>
        </table>
    
    <table tableshort="AP" recid="x000000010000000f" prefix="PRAP">
              <field fieldno="2" value="1">1</field>
              <field fieldno="4">10900100000</field>
              <field fieldno="7" catNo="10" catval="43">Normal</field>
              <field fieldno="8" catNo="28" catval="5">Abfallbehälter</field>
              <field fieldno="10" value="3.00">3,00</field>
              <field fieldno="11" value="306.00">306,00</field>
              <field fieldno="13" />
              <field fieldno="17" value="918.00">918,00</field>
              <field fieldno="19" value="872.10">872,10</field>
            </table>
    </root>
    wird dann der gesuchte Wert ausgegeben.

    XSLT 2.0 kann man unter anderem mit Saxon 9 und mit AltovaXML Tools ausführen.

    Comment


    • #3
      Danke das hat mir schonmal etwas weitergeholfen...mein Problem ist aber auch das in der einen XML Datei andere "fieldnames" mit der selben fieldno vorkommen können, welche nach diesem Beispiel aber mit ausgegeben werden, obwohl Sie nicht sollen..

      Beispielsweise hier:
      Code:
      <field tableshort="PR" tablename="Offer" fieldno="3" fieldname="SeqNo" fieldlabel="Angebotsnr." fieldlength="10" fieldtype="L" />
          <field tableshort="PR" tablename="Offer" fieldno="6" fieldname="Date" fieldlabel="Datum" fieldlength="10" fieldtype="D" />
          <field tableshort="PR" tablename="Offer" fieldno="10" fieldname="OfferDate" fieldlabel="Angebotsdatum" fieldlength="10" fieldtype="D" />
          <field tableshort="PR" tablename="Offer" fieldno="12" fieldname="NetTotal" fieldlabel="Summe netto" fieldlength="14" fieldtype="F" />
          <field tableshort="PR" tablename="Offer" fieldno="13" fieldname="OfferValue" fieldlabel="Angebotswert" fieldlength="14" fieldtype="F" />
          <field tableshort="PR" tablename="Offer" fieldno="14" fieldname="OptTotal" fieldlabel="Summe Opt." fieldlength="14" fieldtype="F" />
          <field tableshort="PR" tablename="Offer" fieldno="16" fieldname="DiscP" fieldlabel="Rab.(%)" fieldlength="7" fieldtype="F" />
          <field tableshort="PR" tablename="Offer" fieldno="17" fieldname="Discnt" fieldlabel="Rabatt" fieldlength="14" fieldtype="F" />
          <field tableshort="PR" tablename="Offer" fieldno="72" fieldname="OffText" fieldlabel="Ang.Text" fieldlength="400" fieldtype="C" />
          <field tableshort="PR" tablename="Offer" fieldno="190" fieldname="SalesRep" fieldlabel="Innendienst" fieldlength="80" fieldtype="Z" />
          <field tableshort="PR" tablename="Offer" fieldno="191" fieldname="Rep" fieldlabel="Handelsvertreter" fieldlength="80" fieldtype="Z" />
          <field tableshort="PR" tablename="Offer" fieldno="4005" fieldname="Currency" fieldlabel="Währung" fieldlength="80" fieldtype="K" />
          <field tableshort="AP" tablename="OfferItem" fieldno="2" fieldname="PosNo" fieldlabel="Position" fieldlength="9" fieldtype="L" />
          <field tableshort="AP" tablename="OfferItem" fieldno="4" fieldname="ItemNo" fieldlabel="Artikel-Nr." fieldlength="45" fieldtype="C" />
          <field tableshort="AP" tablename="OfferItem" fieldno="7" fieldname="ProdGrp" fieldlabel="Produktgr." fieldlength="80" fieldtype="K" />
          <field tableshort="AP" tablename="OfferItem" fieldno="8" fieldname="Product" fieldlabel="Produkt" fieldlength="80" fieldtype="K" />
          <field tableshort="AP" tablename="OfferItem" fieldno="10" fieldname="Quantity" fieldlabel="Menge" fieldlength="15" fieldtype="F" />
          <field tableshort="AP" tablename="OfferItem" fieldno="11" fieldname="SellingPrice" fieldlabel="Verkaufspreis" fieldlength="14" fieldtype="F" />
          <field tableshort="AP" tablename="OfferItem" fieldno="13" fieldname="DiscP" fieldlabel="Rab.(%)" fieldlength="7" fieldtype="F" />

      Will ich nun z.B. den Wert Des "OfferDate" (fieldno 10, tableshort PR ), bekomme ich aber auch den Wert der fieldno 10 bei tableshort AP, welcher ja aber nicht ausgegeben werden soll..

      Wieder ein Beispiel:

      Code:
      <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        version="2.0">
      
        
        <xsl:param name="fn" select="'OfferDate'"/>
        
        <xsl:key name="k1" match="table" use="@tableshort"/>
        <xsl:key name="k2" match="table/field" use="@fieldno"/>
        
        <xsl:template match="/">
        	
          <xsl:variable name="field" select="//fields/field[@fieldname = $fn]"/>
          <p><xsl:value-of select="key('k2', $field/@fieldno, key('k1', $field/@tableshort))"/></p>
          
        </xsl:template>
        
      </xsl:stylesheet>

      Ausgabe:

      Code:
      05.05.2010 3,00 5,00 1,00..............
      es soll hier allerdings nur das Datum stehen..

      Ich bitte um Hilfe

      Comment


      • #4
        Poste bitte mal ein minimales, aber komplettes Eingabedokument, bei dem das Problem auftritt.

        Comment


        • #5
          Hier ist mal eine komplette Datei als Beispiel. Diese Datei soll nun mithilfe von XSLT in eine PDF umgewandelt werden..Bitte um Antwort
          Attached Files

          Comment


          • #6
            Dass die table Elemente in einander verschachtelt sein können, ging aus den bisherigen Posts überhaupt nicht hervor. Dann klappt das mit dem zweiten key nicht mehr, aber das direkte Adressieren sollte klappen:
            Code:
            <xsl:stylesheet
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              version="2.0">
              
              <xsl:param name="fn" select="'OfferDate'"/>
              
              <xsl:key name="k1" match="table" use="@tableshort"/>
            
              <xsl:template match="/">
                <xsl:variable name="field" select="//fields/field[@fieldname = $fn]"/>
                <xsl:value-of select="key('k1', $field/@tableshort)/field[@fieldno = $field/@fieldno]"/>
              </xsl:template>
              
            </xsl:stylesheet>

            Comment


            • #7
              Vielen Dank jetzt müsste ich nur noch wissen wie man darunter weitere Werte ausgeben kann. Bei meinen Versuchen kam in der ausgabe nur jeweils der letzte Wert

              Code:
              <xsl:stylesheet
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                version="2.0">
                
                <xsl:param name="fn" select="'OfferDate'"/>
                
                <xsl:key name="k1" match="table" use="@tableshort"/>
              
                <xsl:template match="/">
                  <xsl:variable name="field" select="//fields/field[@fieldname = $fn]"/>
                  <xsl:value-of select="key('k1', $field/@tableshort)/field[@fieldno = $field/@fieldno]"/>
                </xsl:template>
              
              
                <xsl:param name="fn" select="'SeqNo"/>
                
                <xsl:key name="k1" match="table" use="@tableshort"/>
              
                <xsl:template match="/">
                  <xsl:variable name="field" select="//fields/field[@fieldname = $fn]"/>
                  <xsl:value-of select="key('k1', $field/@tableshort)/field[@fieldno = $field/@fieldno]"/>
                </xsl:template>
                
              </xsl:stylesheet>

              Was genau muss hier noch geändert werden damit beide ausgegeben werden? Dann wäre mein Problem gelöst Danke schonmal

              Comment


              • #8
                Definiere als Parameter eine Sequenz von Strings oder einen String, den man per tokenize in eine solche Sequenz verwandeln kann:
                Code:
                <xsl:stylesheet
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  exclude-result-prefixes="xs"
                  version="2.0">
                  
                  <xsl:param name="input" select="'OfferDate|SeqNo'"/>
                  <xsl:param name="fns" select="tokenize($input, '\|')"/>
                  
                  <xsl:key name="k1" match="table" use="@tableshort"/>
                
                  <xsl:template match="/">
                    <xsl:variable name="root" select="/"/>
                    <xsl:for-each select="$fns">
                      <div>
                        <xsl:variable name="field" select="$root//fields/field[@fieldname = current()]"/>
                        <xsl:value-of select="key('k1', $field/@tableshort, $root)/field[@fieldno = $field/@fieldno]"/>
                      </div>
                    </xsl:for-each>
                  </xsl:template>
                  
                </xsl:stylesheet>

                Comment


                • #9
                  Danke, Danke, Danke Hast mir sehr geholfen

                  Comment


                  • #10
                    Hallo nochmal..
                    Könntest du mir vielleicht noch einmal helfen?

                    Also die Werte bekomme ich jetzt ja rein, aber wie schaffe ich es sie richtig anzuordnen?
                    z.B.

                    oben stehen die Texte Positionsnummer, Artikelnummer, Artikelbezeichnung, Menge... darunter dann am besten ein Strich und dann die Werte entsprechend den eben genannten Bezeichnungen.. Dann eben erst für Positionsnummer 1......, darunter für Positionsnummer 2.. usw.
                    Ich hoffe du verstehst was ich meine (Es soll halt am Ende ein fertiges Angebot als PDF ausgegeben werden).

                    Ich habe schon versucht mich in XSL:Fo hereinzuarbeiten aber komme damit nicht richtig klar.

                    Vielen Dank nochmal im Vorraus

                    Comment

                    Working...
                    X