2016-08-09 13 views
1

Ich bin neu bei XSL-FO und XPATH und habe Schwierigkeiten, die folgende Anforderung zu erfüllen. Meine Forderung ist es, Ergebnisse, wie unten aus dem XML und XSL-FO zu erhalten:XSLT: Verschachtelte Schleifen, wenn Bedingung

ich die Ergebnisse, wie unten

Line# Item Description Quantity LINE_ARRIVAL_DATE 
1  test PO print-1  15  30-AUG-2016 
2  test PO print-2  25  30-SEP-2016 

zeigen müssen, wie Sie die Line # sehen, Item Description und Quantity kommen aus PO_DATA/LINES/LINES_ROW/ Informationen und LINE_ARRIVAL_DATE kommt aus PO_DATA/PURCHASEORDER/LINE_REF/PO_LINE_TYPE und der einzige Weg, sie ist von der PO_LINE_ID in LINES_ROW und PO_LINE_TYPE XML Eltern verwandt sind.
Ich dachte 2 mit for-each aber das nicht hilft, und ich bin nicht in der Lage für-die jeweils mit dem XSL-FO (unten) und vielleicht auf XSL-FO meines Mangel an Wissen zu tun, ist die Einschränkung. Bitte lassen Sie mich wissen, ob ich diese Anforderung erfüllen kann und auch wie ich das erreichen kann.

Danke fürs schauen.

<PO_DATA> 
    <SEGMENT1>321178</SEGMENT1> 
    <LINES> 
     <LINES_ROW> 
      <LINE_NUM>1</LINE_NUM> 
      <ITEM_DESCRIPTION>test PO print-1</ITEM_DESCRIPTION> 
      <CANCEL_FLAG>N</CANCEL_FLAG> 
      <UNIT_MEAS_LOOKUP_CODE>EACH</UNIT_MEAS_LOOKUP_CODE> 
      <ORDER_TYPE_LOOKUP_CODE>QUANTITY</ORDER_TYPE_LOOKUP_CODE> 
      <UNIT_PRICE>25</UNIT_PRICE> 
      <QUANTITY>15</QUANTITY> 
      <PO_HEADER_ID>408363</PO_HEADER_ID> 
      <PO_LINE_ID>697709</PO_LINE_ID> 
     </LINES_ROW> 
     <LINES_ROW> 
      <LINE_NUM>2</LINE_NUM> 
      <ITEM_DESCRIPTION>test PO print-2</ITEM_DESCRIPTION> 
      <CANCEL_FLAG>N</CANCEL_FLAG> 
      <UNIT_MEAS_LOOKUP_CODE>EACH</UNIT_MEAS_LOOKUP_CODE> 
      <ORDER_TYPE_LOOKUP_CODE>QUANTITY</ORDER_TYPE_LOOKUP_CODE> 
      <UNIT_PRICE>25</UNIT_PRICE> 
      <QUANTITY>15</QUANTITY> 
      <PO_HEADER_ID>408363</PO_HEADER_ID> 
      <PO_LINE_ID>697710</PO_LINE_ID> 
     </LINES_ROW> 
    </LINES> 
    <PURCHASEORDER> 
      <PO_HEADER_ID>408363</PO_HEADER_ID> 
      <LINE_REF> 
       <POLINE_TYP> 
        <PO_LINE_ID>697709</PO_LINE_ID> 
        <LINE_ARRIVAL_DATE>30-AUG-2016</LINE_ARRIVAL_DATE> 
       </POLINE_TYP> 
       <POLINE_TYP> 
        <PO_LINE_ID>697710</PO_LINE_ID> 
        <LINE_ARRIVAL_DATE>30-SEP-2016</LINE_ARRIVAL_DATE> 
       </POLINE_TYP> 
      </LINE_REF>  
    </PURCHASEORDER> 
</PO_DATA> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My PO Lines</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th style="text-align:left">Line #</th> 
     <th style="text-align:left">Item Description</th> 
     <th style="text-align:left">spolineid</th>  
     <th style="text-align:left">cpolineid</th>  
     <th style="text-align:left">comparison</th>  
     </tr> 
     <xsl:for-each select="PO_DATA/LINES/LINES_ROW"> 
     <!--xsl:for-each select="PURCHASEORDER/LINE_REF"-->  
     <!--xsl:for-each select="PURCHASEORDER/LINE_REF/POLINE_TYP"-->   
     <tr> 
     <td><xsl:value-of select="LINE_NUM"/></td> 
     <td><xsl:value-of select="ITEM_DESCRIPTION"/></td> 
     <!--xsl:variable name="spolineid" select="string(PO_LINE_ID)"/>  
     <td><xsl:value-of select="$spolineid" /></td> 
     <xsl:variable name="cpolineid" select="string(../../PURCHASEORDER/LINE_REF/POLINE_TYP/PO_LINE_ID)"/>   
     <td><xsl:value-of select="$cpolineid" /></td> 
     <td><xsl:if test = "$spolineid = $cpolineid "> <xsl:value-of select="../../PURCHASEORDER/LINE_REF/POLINE_TYP/LINE_ARRIVAL_DATE"/></xsl:if></td--> 

     <td><xsl:for-each select="PO_DATA/PURCHASEORDER/LINE_REF/POLINE_TYP"> 
       <xsl:value-of select="LINE_ARRIVAL_DATE"/> 
       </xsl:for-each></td>   

     </tr> 
     </xsl:for-each> 
     <!--/xsl:for-each-->  
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Antwort

0

Nach Sheet wird funktionieren, wenn Sie XSLT 1.0 Prozessor verwenden:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My PO Lines</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th style="text-align:left">Line #</th> 
         <th style="text-align:left">Item Description</th> 
         <th style="text-align:left">Quantity</th>  
         <th style="text-align:left">LINE_ARRIVAL_DATE</th> 
        </tr> 
        <xsl:for-each select="PO_DATA/LINES/LINES_ROW"> 
         <tr> 
          <td><xsl:value-of select="LINE_NUM"/></td> 
          <td><xsl:value-of select="ITEM_DESCRIPTION"/></td> 
          <td><xsl:value-of select="QUANTITY"/></td> 
          <td> 
           <xsl:value-of select="(/PO_DATA/PURCHASEORDER/LINE_REF/POLINE_TYP[string(PO_LINE_ID) = string(current()/PO_LINE_ID)]/LINE_ARRIVAL_DATE)[1]"/> 
          </td>   
         </tr> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Zu Ihrer Information I elegantere xsl hinzugefügt: Schlüssel und Schlüssel() Lösung:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:key name="LINE" match="/PO_DATA/PURCHASEORDER/LINE_REF/POLINE_TYP" use="PO_LINE_ID"/> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <h2>My PO Lines</h2> 
       <table border="1"> 
        <tr bgcolor="#9acd32"> 
         <th style="text-align:left">Line #</th> 
         <th style="text-align:left">Item Description</th> 
         <th style="text-align:left">Quantity</th>  
         <th style="text-align:left">LINE_ARRIVAL_DATE</th> 
        </tr> 
        <xsl:for-each select="PO_DATA/LINES/LINES_ROW"> 
         <tr> 
          <td><xsl:value-of select="LINE_NUM"/></td> 
          <td><xsl:value-of select="ITEM_DESCRIPTION"/></td> 
          <td><xsl:value-of select="QUANTITY"/></td> 
          <td> 
           <xsl:value-of select="(key('LINE',PO_LINE_ID)/LINE_ARRIVAL_DATE)[1]"/> 
          </td>   
         </tr> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Oben zwei XSLT Stylesheets werden über XSLT 1.0 Prozessor Saxon 6.5.5 und MSXML getestet.

+0

Da es nur ein 'POLINE_TYP' Element gibt (von dem wir wissen), könnte' xsl: key/@ match' einfach 'match =" POLINE_TYP "' sein. Wenn 'POLINE_TYP/PO_LINE_ID' Werte eindeutig sind, dann wird das' '(...) [1]' "in der' @ select' nicht benötigt, da es immer nur eins geben würde. Es kommt darauf an, wie defensiv Sie über mögliche irreguläre Eingaben sein wollen. –

+0

Ja, mir wurde von Benutzern wie "Das Element ist einzigartig" oder "Es erscheint genau einmal" gesagt. Allerdings, wenn ich die strikte Typ-System-Deklaration in XSLT 2.0 verwende. Ich stoße häufig auf die Laufzeitfehlermeldung des XSLT-Prozessors, dass die Vorbedingung wie zB = "element()" durch tatsächliche Eingabedaten unterbrochen wurde. – tmakita

+0

Vielen Dank für die Antwort hier. Es hat mir sehr geholfen, meine Anforderungen zu erfüllen. Eine Sache, die mir aufgefallen ist, war, dass ich XML Notepad zu Beginn verwendet habe, aber erkannte, dass die eq-Funktion in XML Notepad nicht vorhanden ist und daher nicht verwendet werden konnte. Dennoch funktionierte diese Anforderung in Oracle E-Business-Suite. –

Verwandte Themen