Я новичок в 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>
Поскольку существует только один элемент 'POLINE_TYP' (что мы знаем),' xsl: key/@ match' может быть просто 'match =" POLINE_TYP "'. Если значения 'POLINE_TYP/PO_LINE_ID' уникальны, тогда' '(...) [1]' 'в' @ select' не требуется, так как всегда будет только один. Это сводится к тому, насколько оборонительным вы хотите быть, возможно, с неправильным входом. –
Да, мне сказали такие пользователи, как «Элемент уникален» или «Он появляется ровно один раз». Однако, когда я использую строгое объявление системы типов в XSLT 2.0. Я часто сталкиваюсь с сообщением об ошибке времени выполнения XSLT-процессора, что предварительное условие, такое как = «element()», было нарушено фактическими входными данными. – tmakita
Спасибо всем за ответ здесь. Это действительно помогло мне выполнить мои требования. Одна вещь, которую я заметил, это то, что я использовал блокнот XML для первоначального запуска, но понял, что функция eq отсутствует в блокноте XML и, следовательно, не может ее использовать. Тем не менее это требование работало в пакете Oracle E-business. –