我对使用xslt
转换xml以下有疑问需要在xslt中添加逻辑,例如,如果当前月份的'TERM_DUE_DATE_FROM_PS'仅包含xml中的<G_INV_TERM>....</G_INV_TERM>
。目前xml重复G_INV_TERM 3次,因此根据我想要只显示一次的条件。
请帮助,下面是示例xml:
<LIST_G_INV_TERM>
<G_INV_TERM>
<HEADER_SALES_ORDER>1125093</HEADER_SALES_ORDER>
<TERM_SEQUENCE_NUMBER>1</TERM_SEQUENCE_NUMBER>
<SHIP_DATE_ACTUAL>01-JUL-16</SHIP_DATE_ACTUAL>
<SHIP_VIA>UPS 123</SHIP_VIA>
<WAYBILL_NUMBER>0</WAYBILL_NUMBER>
<PURCHASE_ORDER_NUMBER>NET_30_TESTING</PURCHASE_ORDER_NUMBER>
<TERM_DUE_DATE_FROM_PS>31-JUL-16</TERM_DUE_DATE_FROM_PS>
</G_INV_TERM>
<G_INV_TERM>
<HEADER_SALES_ORDER>1125093</HEADER_SALES_ORDER>
<TERM_SEQUENCE_NUMBER>1</TERM_SEQUENCE_NUMBER>
<SHIP_DATE_ACTUAL>01-JUL-16</SHIP_DATE_ACTUAL>
<SHIP_VIA>UPS 123</SHIP_VIA>
<WAYBILL_NUMBER>0</WAYBILL_NUMBER>
<PURCHASE_ORDER_NUMBER>NET_30_TESTING</PURCHASE_ORDER_NUMBER>
<TERM_DUE_DATE_FROM_PS>31-AUG-16</TERM_DUE_DATE_FROM_PS>
</G_INV_TERM>
<G_INV_TERM>
<HEADER_SALES_ORDER>1125093</HEADER_SALES_ORDER>
<TERM_SEQUENCE_NUMBER>1</TERM_SEQUENCE_NUMBER>
<SHIP_DATE_ACTUAL>01-JUL-16</SHIP_DATE_ACTUAL>
<SHIP_VIA>UPS 123</SHIP_VIA>
<WAYBILL_NUMBER>0</WAYBILL_NUMBER>
<PURCHASE_ORDER_NUMBER>NET_30_TESTING</PURCHASE_ORDER_NUMBER>
<TERM_DUE_DATE_FROM_PS>30-SEP-16</TERM_DUE_DATE_FROM_PS>
</G_INV_TERM>
</LIST_G_INV_TERM>
输出:当前月份JUL,所以显示
<G_INV_TERM>
<HEADER_SALES_ORDER>1125093</HEADER_SALES_ORDER>
<TERM_SEQUENCE_NUMBER>1</TERM_SEQUENCE_NUMBER>
<SHIP_DATE_ACTUAL>01-JUL-16</SHIP_DATE_ACTUAL>
<SHIP_VIA>UPS 123</SHIP_VIA>
<WAYBILL_NUMBER>0</WAYBILL_NUMBER>
<PURCHASE_ORDER_NUMBER>NET_30_TESTING</PURCHASE_ORDER_NUMBER>
<TERM_DUE_DATE_FROM_PS>31-JUL-16</TERM_DUE_DATE_FROM_PS>
</G_INV_TERM>
我们正在使用XSLT 2.0
由于
答案 0 :(得分:0)
EXSLT肯定有set:distinct()
功能,不包括重复节点。
每个XSLT 1.0处理器都应该支持。
http://exslt.org/set/index.html
不幸的是,你想要完成的事情并不明显。如果您只想要一个匹配元素,那么它将是[1]
:
//G_INV_TERM[TERM_DUE_DATE_FROM_PS = '30-SEP-16'][1]
也许是以下形式:
<xsl:copy-of select="//G_INV_TERM[TERM_DUE_DATE_FROM_PS = '30-SEP-16'][1]"/>
答案 1 :(得分:0)
以这种方式尝试:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="current-month" select="concat(('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC')[month-from-date(current-date())], '-', substring(xs:string(current-date()), 3, 2))" />
<xsl:template match="/LIST_G_INV_TERM">
<xsl:copy-of select="G_INV_TERM[ends-with(TERM_DUE_DATE_FROM_PS, $current-month)]"/>
</xsl:template>
</xsl:stylesheet>
这将仅复制G_INV_TERM
在当前月份(转换月份)中落入的TERM_DUE_DATE_FROM_PS
元素。
如果没有这样的元素,结果将为空。如果有两个或更多这样的元素,它们都将被复制,从而导致格式错误的XML文档。