过滤元素:当前日期介于元素'startdate'和"结束日期"之间?



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

下面是我的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倍的属性元素。我只想显示实际存在的虚元素。像这样的过滤器:

当前日期介于"startdate"one_answers"enddate"之间

这是我期望的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个"vacature"元素中只有1个被过滤,因为当前日期介于开始日期和结束日期之间。

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

下面的样式表并不完全产生您所显示的结果,因为它似乎没有意义(一方面它是不完整的HTML,另一方面它与多余的名称空间混淆在一起)。但是它会挑出条件为真的一个vacature元素。

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

最后,xsl:if元素测试开始日期是否比当前日期"小",结束日期是否比当前日期"大"。

样式表

<?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元素匹配。如果在不同的日期多次调用模板,这可能会扭曲结果。

相关内容

  • 没有找到相关文章

最新更新