Xsl fo XSLT:嵌套循环,如果条件为
我不熟悉XSL-FO和XPATH,很难达到以下要求。我的要求是从XML和XSL-FO中获得如下结果: 我需要显示以下结果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 如您所见,行#,项目描述和数量来自采购订单数据/行/行行行/信息,行(到达)日期来
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记事本看到它工作,所以您使用了什么编辑器来正确查看此输出。谢谢我在用