我有一些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之间。
答案 0 :(得分:0)
您想要实现的目标并不完全清楚,但据我所知,您正在尝试比较XSLT 1.0中的日期。
下面的样式表并没有完全显示你所显示的结果,因为它似乎没有意义(一方面它是不完整的HTML,另一方面是多余的命名空间)。但它挑出了你的条件成真的vacature
元素。
方法是这样的:为当前日期创建一个变量(在XSLT 1.0中不能立即使用,你需要像EXSLT这样的扩展函数)。然后,将XML输入中startdate
和enddate
元素的内容转换为允许比较的格式,即在这种情况下为 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 < $current-date and $end-date > $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
元素匹配的顶级元素。如果在不同日期多次调用模板,则可能会使结果失真。