2016-08-09 2 views
1

Я новичок в XSL-FO и XPATH и затрудняюсь в достижении следующего требования. Мое требование, чтобы получить результат, как показано ниже с XML и XSL-FO:XSLT: Вложенные петли, если Условие

Мне нужно, чтобы показать результаты, как показано ниже

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 

Как вы видите Line #, Item Description и Quantity приходят из PO_DATA/LINES/LINES_ROW/ информации и LINE_ARRIVAL_DATE исходит от PO_DATA/PURCHASEORDER/LINE_REF/PO_LINE_TYPE и единственный способ, которым они связаны, составляет PO_LINE_ID в LINES_ROW и PO_LINE_TYPE XML-родители.
Я думал, что у меня есть 2 для каждого, но это не помогает, и я не могу это сделать - каждый с XSL-FO (см. Ниже), и, возможно, мое отсутствие знаний о XSL-FO является ограничением. Пожалуйста, дайте мне знать, могу ли я достичь этого требования, а также того, как я мог бы это достичь.

Спасибо, что посмотрели.

<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> 

ответ

0

Следующая таблица стилей будет работать, если вы используете XSLT 1.0 Процессор:

<?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> 

Для справки я добавил более изящный XSL: ключ и ключ() решение:

<?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> 

Выше двух таблиц стилей XSLT тестируются с помощью XSLT 1.0 процессора Saxon 6.5.5 и MSXML.

+0

Поскольку существует только один элемент 'POLINE_TYP' (что мы знаем),' xsl: key/@ match' может быть просто 'match =" POLINE_TYP "'. Если значения 'POLINE_TYP/PO_LINE_ID' уникальны, тогда' '(...) [1]' 'в' @ select' не требуется, так как всегда будет только один. Это сводится к тому, насколько оборонительным вы хотите быть, возможно, с неправильным входом. –

+0

Да, мне сказали такие пользователи, как «Элемент уникален» или «Он появляется ровно один раз». Однако, когда я использую строгое объявление системы типов в XSLT 2.0. Я часто сталкиваюсь с сообщением об ошибке времени выполнения XSLT-процессора, что предварительное условие, такое как = «element()», было нарушено фактическими входными данными. – tmakita

+0

Спасибо всем за ответ здесь. Это действительно помогло мне выполнить мои требования. Одна вещь, которую я заметил, это то, что я использовал блокнот XML для первоначального запуска, но понял, что функция eq отсутствует в блокноте XML и, следовательно, не может ее использовать. Тем не менее это требование работало в пакете Oracle E-business. –

Смежные вопросы