XSLT - 添加条件以排除重复的标记

时间:2016-07-12 13:21:23

标签: xml xslt

我对使用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

由于

2 个答案:

答案 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文档。