我有一些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倍的属性元素。我只想显示实际存在的虚元素。像这样的过滤器:
这是我期望的html输出:当前日期介于"startdate"one_answers"enddate"之间
<?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
元素。
startdate
和enddate
元素的内容转换为允许比较的格式,即在本例中为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 < $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
元素匹配。如果在不同的日期多次调用模板,这可能会扭曲结果。