使用Java在XSLT中进行日期比较

时间:2015-12-02 18:43:55

标签: xslt-1.0

我使用下面的代码片段来获取XSLT中的当前日期:

<xsl:variable name="currentDate">
    <xsl:variable name="datePattern">yyyy-MM-dd'T'HH:mm:ss Z</xsl:variable>
    <xsl:value-of select="java:format(java:java.text.SimpleDateFormat.new($datePattern), java:java.util.Date.new())" />
</xsl:variable>

要求是,检查ShippedDate属性值是否等于今天的日期,然后包含<Monitor>元素,否则排除。

<Order>
    <Monitors>
        <Monitor ShippedDate="2015-11-10T00:00:00-05:00"/>
        <Monitor ShippedDate="2015-12-03T00:00:00-05:00"/>
    </Monitors>
</Order>

有人可以帮我解决一下需要用什么功能来实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

  

要求是,检查ShippedDate是否等于今天的日期   包括<Monitor>元素,否则排除。

我建议你这样做:

XSLT 1.0(+ EXSLT)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Monitors">
    <xsl:copy>
        <xsl:apply-templates select="Monitor[substring(@ShippedDate, 1, 10) = substring(date:date(), 1, 10)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

测试输入:

<Order>
   <Monitors>
      <Monitor ShippedDate="2015-12-01T00:00:00-05:00"/>
      <Monitor ShippedDate="2015-12-02T00:00:00-05:00"/>
      <Monitor ShippedDate="2015-12-03T00:00:00-05:00"/>
   </Monitors>
</Order>

结果,于2015年12月2日申请时:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
   <Monitors>
      <Monitor ShippedDate="2015-12-02T00:00:00-05:00"/>
   </Monitors>
</Order>

注意:

  1. 这需要一个支持EXSLT date:date()扩展功能的处理器(例如Xalan或Saxon 6.5);

  2. 仅比较日期组件。如果您在与输入中使用的时区不同的时区中运行转换,则结果可能不准确。如果您还想考虑时区,那么还有更多工作要做。

  3. 加了:

      

    作为此的延续,如果ShippedDate都不满足   条件,然后XSLT不能转换任何输出。

    尝试:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:date="http://exslt.org/dates-and-times"
    extension-element-prefixes="date">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:template match="/Order">
        <xsl:variable name="current" select="Monitors/Monitor[substring(@ShippedDate, 1, 10) = substring(date:date(), 1, 10)]"/>
        <xsl:if test="$current">
            <Order>
                <Monitors>
                    <xsl:copy-of select="$current"/>
                </Monitors>
            </Order>
        </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>