我是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来自PO_DATA/LINES/LINES_ROW/信息,LINE_ARRIVAL_DATE来自PO_DATA/PURCHASEORDER/LINE_REF/PO_LINE_TYPE,它们之间唯一的关联方式是通过LINES_ROW和PO_LINE_TYPE XML父对象中的PO_LINE_ID。
我认为使用XSL-FO (如下所示)各有2个for-但这对每个都没有帮助,而且我也无法做到,也许我对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>发布于 2016-08-09 15:22:53
如果您使用的是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进行了测试。
https://stackoverflow.com/questions/38840967
复制相似问题