过滤元素:当前日期在元素'startdate'和'enddate'之间?

时间:2014-08-07 13:47:06

标签: xml xslt xslt-1.0

我有一些xml文件。在这个xml文件中有很多" vacature"元素。我想过滤这些" vacature"元素只显示实际的元素。

以下是我的xml结构示例:

<?xml version="1.0" encoding="utf-8"?>
<sitegegevens>
<vacatures>

<vacature id="27223" >
 <titel>TitelA</titel>
 <startdate>16-05-2014</startdate>
 <enddate>11-08-2014</enddate>
</vacature>

<vacature id="27224" >
 <titel>TitelB</titel>
 <startdate>16-05-2014</startdate>
 <enddate>11-06-2014</enddate>
</vacature>

<vacature id="27225" >
 <titel>TitelC</titel>
 <startdate>16-09-2014</startdate>
 <enddate>11-10-2014</enddate>
</vacature>

</vacatures>
</sitegegevens>

这是我当前的xsl文件:

<xsl:stylesheet 
  version="1.0" 
  xmlns:x="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">

<xsl:template match="vacature">

<h1><xsl:value-of select="titel"/></h1> <br/>

Start date: <xsl:value-of select="startdate"/><br/>
End date: <xsl:value-of select="enddate"/><br/>

<br/>

</xsl:template>
</xsl:stylesheet>

我当前的xsl显示了3倍的空缺元素。我想只展示实际的空缺元素。有些过滤器如下:

  

当前日期介于&#34; startdate&#34;和&#34; enddate&#34;

这是我期望的html输出:

<?xml version="1.0" encoding="utf-8"?><h1 xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:msxsl="urn:schemas-microsoft-com:xslt">TitelA</h1>
<br xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:msxsl="urn:schemas-microsoft-com:xslt" />
Start date: 16-05-2014<br xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:msxsl="urn:schemas-microsoft-com:xslt" />
End date: 11-08-2014<br xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:msxsl="urn:schemas-microsoft-com:xslt" />

就像你看到3&#34; vacature中只有1个&#34;元素已过滤,因为当前日期介于startdate和enddate之间。

1 个答案:

答案 0 :(得分:0)

您想要实现的目标并不完全清楚,但据我所知,您正在尝试比较XSLT 1.0中的日期。

下面的样式表并没有完全显示你所显示的结果,因为它似乎没有意义(一方面它是不完整的HTML,另一方面是多余的命名空间)。但它挑出了你的条件成真的vacature元素。

方法是这样的:为当前日期创建一个变量(在XSLT 1.0中不能立即使用,你需要像EXSLT这样的扩展函数)。然后,将XML输入中startdateenddate元素的内容转换为允许比较的格式,即在这种情况下为 YYYYMMDD

最后,xsl:if元素测试开始日期是否为&#34; less&#34;结束日期是&#34;更大&#34;比当前日期。

<强>样式表

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

    <xsl:variable name="current-date" select="translate(substring-before(date:date-time(), 'T'), '-', '')"/>

    <xsl:template match="vacature">

        <xsl:variable name="start-date" select="concat(substring(startdate, 7),substring(startdate,4,2), substring(startdate,1,2))"/>
        <xsl:variable name="end-date" select="concat(substring(enddate, 7),substring(enddate,4,2), substring(enddate,1,2))"/>

        <xsl:if test="$start-date &lt; $current-date and $end-date &gt; $current-date">
            <xsl:copy>
                <xsl:copy-of select="*|@*"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<vacature id="27223">
   <titel>TitelA</titel>
   <startdate>16-05-2014</startdate>
   <enddate>11-08-2014</enddate>
</vacature>

如您所见,$current-date的变量定义是模板外部与vacature元素匹配的顶级元素。如果在不同日期多次调用模板,则可能会使结果失真。