首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT :嵌套循环,If条件

XSLT :嵌套循环,If条件
EN

Stack Overflow用户
提问于 2016-08-09 10:07:39
回答 1查看 213关注 0票数 1

我是XSL-FO和XPATH的新手,很难达到以下要求。我的要求是从XML和XSL-FO获得如下结果:

我需要显示如下结果

代码语言:javascript
复制
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 DescriptionQuantity来自PO_DATA/LINES/LINES_ROW/信息,LINE_ARRIVAL_DATE来自PO_DATA/PURCHASEORDER/LINE_REF/PO_LINE_TYPE,它们之间唯一的关联方式是通过LINES_ROWPO_LINE_TYPE XML父对象中的PO_LINE_ID

我认为使用XSL-FO (如下所示)各有2个for-但这对每个都没有帮助,而且我也无法做到,也许我对XSL-FO缺乏了解是个限制。请让我知道,如果我可以达到这一要求,以及我可以如何实现这一点。

谢谢你的关注。

代码语言:javascript
复制
<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>
代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2016-08-09 15:22:53

如果您使用的是XSLT 1.0处理程序,则可以使用以下样式表:

代码语言:javascript
复制
<?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:key和key()解决方案:

代码语言:javascript
复制
<?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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38840967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档