XSLT - 使用日期和当前日期过滤 XML 节点 () [英] XSLT - Filter XML nodes with dates and current date ()

查看:25
本文介绍了XSLT - 使用日期和当前日期过滤 XML 节点 ()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于下面的 XML,当字段 StartDate 不等于单元 5000 的任何 StartDate 项时,我只需要删除单元 6000 的所有 XML 节点(还要确保 startDate 小于等于当前日期并且 EndDate 大于或等于当前日期)

For below XML i need to delete all XML nodes of only Unit 6000 when field StartDate is not equal to any of the StartDate items of unit 5000 and (also make sure startDate is less than equal to current date and EndDate is greater than or equal to current date)

我试图匹配一个模板,但似乎是一个很好的匹配

I tried to match a template but does to seems to be a good match

<?xml version="1.0" encoding="UTF-8"?>
<AllRecords>
   <Records>
      <Record>
         <Items>
            <EndDate>2021-03-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>1000</company>
                  <Newplant>TEST1</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2021-01-01T00:00:00.000</StartDate>
            <Unit>5000</Unit>
            <Status>A</Status>
         </Items>
         <Items>
            <EndDate>2020-12-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>1000</company>
                  <Newplant>TEST2</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2020-05-01T00:00:00.000</StartDate>
            <Unit>5000</Unit>
            <Status>A</Status>
         </Items>
         <Items>
            <EndDate>2021-02-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>1000</company>
                  <Newplant>TEST3</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2021-02-01T00:00:00.000</StartDate>
            <Unit>5000</Unit>
            <Status>A</Status>
         </Items>
         <Items>
            <EndDate>2020-12-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>2000</company>
                  <Newplant>TEST4</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2020-01-01T00:00:00.000</StartDate>
            <Unit>6000</Unit>
            <Status>A</Status>
         </Items>
         <Items>
            <EndDate>2021-03-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>2010</company>
                  <Newplant>TEST5</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2021-01-01T00:00:00.000</StartDate>
            <Unit>6000</Unit>
            <Status>A</Status>
         </Items>
         <Items>
            <EndDate>2021-06-31T00:00:00.000</EndDate>
            <PlantDetails>
               <PlantDetailsUS>
                  <company>2020</company>
                  <Newplant>TEST5</Newplant>
               </PlantDetailsUS>
            </PlantDetails>
            <StartDate>2021-01-093T00:00:00.000</StartDate>
            <Unit>6000</Unit>
            <Status>A</Status>
         </Items>
      </Record>
   </Records>
</AllRecords>

XSLT 代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  <xsl:output method="xml" indent="yes"/>  
  <xsl:strip-space elements="*"/>  
  <xsl:template match="@*|node()"> 
    <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
  </xsl:template>  
  <xsl:template 
       match="Items[Unit=6000][not(StartDate = ../Items[Unit=5000]/StartDate)] [(StartDate &lt;= current-date())] [(EndDate &gt;= current-date())]"/> 
</xsl:stylesheet>

推荐答案

第一件事:为了将日期与当前日期进行比较,您需要 XSLT 2.0(或在 XSLT 1.0 中获取当前日期的替代方法,例如扩展函数或参数).

First thing: in order to compare dates to current date you need XSLT 2.0 (or an alternative way to get the current date in XSLT 1.0, e.g. an extension function or a parameter).

接下来,您的输入包含dateTimes,而不是dates.要进行有效的比较,您需要将它们与当前日期时间进行比较,或者在将它们与当前日期进行比较之前将它们转换为日期.试试:

Next, your input contains dateTimes, not dates. To make a valid comparison, you need to either compare them to the current dateTime or convert them to dates before comparing them to the current date. Try:

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">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="k1" match="Items[Unit=5000]" use="StartDate" />

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

<xsl:template match="Items[Unit=6000][not(key('k1', StartDate)) or xs:date(substring(StartDate, 1, 10)) gt current-date() or xs:date(substring(EndDate, 1, 10)) lt current-date()]"/>

</xsl:stylesheet>

这篇关于XSLT - 使用日期和当前日期过滤 XML 节点 ()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆