2017-07-21 56 views
1

我需要根據使用XSLT 1(和EXSLT)的日期比較將xml文檔轉換爲另一個xml文檔。模板匹配基於日期的XSLT1跳過子元素

以簡化形式的XML

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

我只希望B/E元件,其中C = < todaysdate < = D類似物(如2017年7月21日的)

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

的xsl我到目前爲止是

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

它給我

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

我需要擺脫B標籤 - 但無法弄清楚如何做到這一點。我試過使用

<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(D)) or ($start &lt;= $today and $end &gt;= $today)"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 

但是我得到完整的XML。當在C和D中使用整數值時,我知道如何將條件放在匹配內(如下圖所示選擇C = 1的條件),但不能在日期比較中弄清楚。任何幫助表示讚賞。對不起,如果這是一個蹩腳的問題 - 我是XSLT新手:)

<xsl:template match="A[B/E/C='1']"> 

回答

0

哎呀。不是(d)與未(E/d)取代,現在的工作

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

然而,在我怎麼可能把日期標準模板的比賽中仍然有興趣。

+0

「*我怎麼能把日期標準放在模板匹配的範圍內*」你不能在匹配模式中引用一個變量,所以你可能不想這樣做。但是你可以通過將模板僅應用於那些通過測試的'B'來完成。 –