2017-07-21 1 views
1

Ich muss ein XML-Dokument in ein anderes xml-Dokument basierend auf dem Datumsvergleich mithilfe von XSLT 1 (und EXSLT) konvertieren.Vorlagenübereinstimmung XSLT1 Überspringen von Unterelementen basierend auf dem Datum

Die XML in vereinfachter Form

<TAG> 
    <A> 
     <id>1234</id> 
     <B> 
      <id2>1</id2> 
      <E> 
       <C>2017-07-01</C> 
       <D>2017-07-05</D> 
      </E> 
     </B> 
     <B> 
      <id2>2</id2> 
      <E> 
       <C>2017-07-21</C> 
       <D>2017-07-28</D> 
      </E> 
     </B> 
    </A> 
</TAG> 

Ich will nur die B/E-Elemente, wo C = < todaysdate < = (Stand 2017.07.21) wie D

<TAG> 
    <A> 
     <id>1234</id> 
     <B> 
      <id2>2</id2> 
      <E> 
       <C>2017-07-21</C> 
       <D>2017-07-28</D> 
      </E> 
     </B> 
    </A> 
</TAG> 

The xsl ich habe so weit ist

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times"> 

    <xsl:output method="xml" indent="yes" /> 
    <xsl:variable name="today" 
     select="translate(substring-before(date:date-time(), 'T'), '-', '')" /> 

    <xsl:template match="TAG/A"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 


    <xsl:template match="B/E"> 
     <xsl:variable name="start" select="translate(C, '-', '')" /> 
     <xsl:variable name="end" select="translate(D, '-', '')" /> 
     <xsl:if test="$start &gt; $today or $end &lt; $today"> 
     </xsl:if> 
     <xsl:if 
      test="($start &lt;= $today and not(D)) or ($start &lt;= $today and $end &gt;= $today)"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 


    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

, die mir gibt

<?xml version="1.0"?> 
<TAG> 
     <A> 
       <id>1234</id> 
       <B> 
         <id2>1</id2> 

       </B> 
       <B> 
         <id2>2</id2> 
         <E> 
           <C>2017-07-21</C> 
           <D>2017-07-28</D> 
         </E> 
       </B> 
     </A> 
</TAG> 

Ich muss den B-Tag loswerden - kann aber nicht herausfinden, wie dies zu tun ist. Ich habe versucht,

zu verwenden, aber dann bekomme ich die vollständige XML. Wenn ich Integer-Werte in C und D verwende, weiß ich, wie man die Bedingung in die Übereinstimmung einfügt (um diejenigen auszuwählen, bei denen C = 1 ist, wie unten gezeigt), kann das aber für den Datumsvergleich nicht herausfinden. Jede Hilfe wird geschätzt. Entschuldigung, wenn das eine lahme Frage ist - ich bin XSLT Neuling :)

Antwort

0

Whoops. nicht (D) mit nicht (E/D) ersetzt und arbeitet jetzt

<xsl:template match="B"> 
     <xsl:variable name="start" select="translate(E/C, '-', '')" /> 
     <xsl:variable name="end" select="translate(E/D, '-', '')" /> 
     <xsl:if test="$start &gt; $today or $end &lt; $today"> 
     </xsl:if> 
     <xsl:if 
      test="($start &lt;= $today and not(E/D)) or ($start &lt;= $today and $end &gt;= $today)"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 

jedoch nach wie vor daran interessiert, wie ich die Datumskriterien innerhalb des Spiels von der Vorlage setzen könnte.

+0

"* Wie könnte ich die Datumskriterien innerhalb der Übereinstimmung der Vorlage setzen. *" Sie können keinen Verweis auf eine Variable in Übereinstimmung Muster haben, so dass Sie wahrscheinlich nicht möchten, dass zu tun. Aber Sie könnten es tun, indem Sie Vorlagen nur auf diejenigen "B" anwenden, die den Test bestehen. –

Verwandte Themen