2016-07-12 7 views
0

Ich habe Fragen auf unter Transformieren von XML mittels XSLTXSLT - Hinzufügen Bedingung auszunehmen Tags wiederholt

Notwendigkeit Logik in Xslt hinzuzufügen, wie wenn ‚TERM_DUE_DATE_FROM_PS‘ ist des aktuellen Monats sind nur diese <G_INV_TERM>....</G_INV_TERM> in xml. Momentan wiederholt das xml G_INV_TERM dreimal, also basierend auf der Bedingung, die ich nur einmal anzeigen möchte.

Bitte helfen, unten ist die Probe 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> 

Ausgabe: aktuelle Monat Juli, so zeigt

<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> 

wir verwenden XSLT 2.0

Dank

+0

"* wenn 'TERM_DUE_DATE_FROM_PS' vom aktuellen Monat ist *" Und wenn nicht? - Bitte geben Sie an, ob Sie XSLT 1.0 oder 2.0 verwenden - und ob XSLT 1.0, welcher Prozessor. XSLT 1.0 selbst weiß nicht, wie das aktuelle Datum ist. –

+0

wir verwenden XSLT 2.0 – rslin

Antwort

0

EXSLT hat definitiv set:distinct() Funktion, die sich wiederholende Knoten ausschließt.

Sollte von jedem XSLT 1.0 Prozessor da draußen unterstützt werden.

http://exslt.org/set/index.html

Leider ist es nicht klar, was Sie erreichen wollen. Wenn Sie nur ein Anpassungselement wollen, wäre es [1] sein:

//G_INV_TERM[TERM_DUE_DATE_FROM_PS = '30-SEP-16'][1] 

vielleicht in Form von:

<xsl:copy-of select="//G_INV_TERM[TERM_DUE_DATE_FROM_PS = '30-SEP-16'][1]"/> 
+1

"* Sollte von jedem XSLT 1.0 Prozessor da draußen unterstützt werden. *" Vielleicht sollte es - aber es ist ganz sicher nicht. Wie auch immer, die Frage bezieht sich auf etwas anderes, IMHO. Sie haben vielleicht bemerkt, dass die drei "TERM_DUE_DATE_FROM_PS" -Werte im angegebenen Beispiel ** eindeutig sind. –

+0

@ michael.hor257k dann kann asker definitiv den Ausschnitt verwenden, den ich zur Verfügung gestellt habe. – alamar

+0

Nein, das glaube ich nicht. Der nächste XML-Code enthält möglicherweise nicht "30-SEP-16". In der Tat bin ich mir ziemlich sicher, dass Dokumente, die in drei Monaten produziert werden, dies nicht tun werden. Und die, die das tun (wie das gegebene Beispiel), enthalten es nur einmal - so bewirkt Ihre Hinzufügung von "[1]" nichts. –

0

Versuchen Sie es so:

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> 

Dies wird nur diekopierenElement, dessen TERM_DUE_DATE_FROM_PS im aktuellen Monat fällt (der Monat der Transformation).

Wenn es kein solches Element gibt, ist das Ergebnis leer. Wenn zwei oder mehr solcher Elemente vorhanden sind, werden sie alle kopiert, was zu einem fehlerhaften XML-Dokument führt.

Verwandte Themen