Xsl fo XSLT:嵌套循环,如果条件为

Xsl fo XSLT:嵌套循环,如果条件为,xsl-fo,Xsl Fo,我不熟悉XSL-FO和XPATH,很难达到以下要求。我的要求是从XML和XSL-FO中获得如下结果: 我需要显示以下结果 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 如您所见,行#,项目描述和数量来自采购订单数据/行/行行行/信息,行(到达)日期来

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

我需要显示以下结果

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
如您所见,
行#
项目描述
数量
来自
采购订单数据/行/行行行/
信息,
行(到达)日期
来自
采购订单数据/采购订单/行(参考)/采购订单行(类型
它们之间的唯一关联方式是通过
LINES\u行中的
PO\u行ID
PO\u行类型
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>

321178
1.
测试订单打印-1
N
每个
量
25
15
408363
697709
2.
测试订单打印-2
N
每个
量
25
15
408363
697710
408363
697709
2016年8月30日
697710
2016年9月30日


我的邮政线路
线#
项目说明
spolineid
cpolineid
比较

如果您使用的是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:key和key()解决方案:

<?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进行测试的。

如果您使用的是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:key和key()解决方案:

<?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样式表通过XSLT1.0处理器Saxon 6.5.5和MSXML进行测试。

因为只有一个
POLINE\u TYP
元素(我们知道),所以
xsl:key/@match
可以是
match=“POLINE\u TYP”
。如果
POLINE\u TYP/PO\u LINE\u ID
值是唯一的,则不需要
@select
中的“
(…)[1]
”,因为只有一个值。归根结底,对于可能出现的不规则输入,你希望有多强的防御能力。是的,我从用户那里听说过“元素是唯一的”或“它只出现一次”。但是,当我在XSLT2.0中使用严格的类型系统声明时。我经常遇到XSLT处理器的运行时错误消息,即诸如“element()”之类的先决条件已被实际输入数据破坏。谢谢大家的回复。它确实帮助我完成了我的要求。我注意到的一件事是,我最初使用XML记事本来运行它,但意识到eq函数不存在于XML记事本中,因此无法使用它。尽管如此,这个要求在Oracle电子商务套件中仍然有效。由于我无法通过XML记事本看到它工作,所以您使用了什么编辑器来正确查看此输出。谢谢我在用