我有一组日期,我想创建一个标准,例如“相隔7天”的分区。例如,这是我的源xml:
<root>
<entry date="2019-05-12" />
<entry date="2019-05-19" />
<entry date="2019-05-26" />
<entry date="2019-06-16" />
<entry date="2019-06-23" />
</root>
结果应该是这样的:
<root>
<group>
<val>12.5.</val>
<val>19.5.</val>
<val>26.5.</val>
</group>
<group>
<val>16.6.</val>
<val>23.6.</val>
</group>
</root>
因为前三个日期和最后两个日期都在星期日,所以没有间隔。
到目前为止,我是这样的:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sd="urn:someprefix"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
>
<xsl:output indent="yes"/>
<xsl:template match="root">
<root>
<xsl:copy-of select="sd:partition(distinct-values(for $i in entry/@date return $i cast as xs:date))"/>
</root>
</xsl:template>
<xsl:function name="sd:partition">
<xsl:param name="dates" as="xs:date*"/>
<xsl:for-each-group select="$dates" group-adjacent="format-date(., '[F]')">
<group>
<xsl:for-each select="current-group()">
<val>
<xsl:value-of select="format-date(.,'[D].[M].')"/>
</val>
</xsl:for-each>
</group>
</xsl:for-each-group>
</xsl:function>
</xsl:stylesheet>
仅生成一组。
我如何要求前一个元素相隔7天?我知道持续时间(xs:dayTimeDuration('P1D')
),但是我不知道如何将其与先前的值进行比较。
我使用Saxon 9.8 HE。
答案 0 :(得分:3)
我想您也可以使用group-adjacent
来做到这一点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="entry/@date/xs:date(.)"
group-adjacent=". - (position() - 1) * xs:dayTimeDuration('P7D')">
<group>
<xsl:apply-templates select="current-group()"/>
</group>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match=".[. instance of xs:date]">
<val>{format-date(.,'[D].[M].')}</val>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
要进行分组,您确实需要知道与上一个元素的天数差异,然后可以从差异不为7天的日期开始进行分组。因此,您可以声明一个变量,在其中使用日期和差异构建一些新的XML,然后使用该变量进行分组。
请在您的XSLT中尝试此功能。
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "10.15.2"
},