Xslt 条件排序
我试图根据XML元素的内容对其进行排序,但排序标准取决于内容。我从这里开始:Xslt 条件排序,xslt,Xslt,我试图根据XML元素的内容对其进行排序,但排序标准取决于内容。我从这里开始: <elements> <element createdDate="01/02/2001"/> <element createdDate="01/02/2001" modifiedDate="01/03/2001"/> <element createdDate="01/02/2001" modifiedDate="01/01/2001"/>
<elements>
<element createdDate="01/02/2001"/>
<element createdDate="01/02/2001" modifiedDate="01/03/2001"/>
<element createdDate="01/02/2001" modifiedDate="01/01/2001"/>
...
</elements>
...
(MM/DD/YYYY格式)
我的预期输出是基于修改日期(如果存在)和createdDate(如果修改日期不存在)排序的元素,如下所示:
<elements>
<element createdDate="01/02/2001" modifiedDate="01/03/2001"/>
<element createdDate="01/02/2001"/>
<element createdDate="01/02/2001" modifiedDate="01/01/2001"/>
...
</elements>
<xsl:for-each select="/element">
<xsl:variable name="date">
<xsl:choose>
<xsl:when test="@modifiedDate">
<xsl:value-of select="@modifiedDate"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@createdDate"/>
</xsl:otherwise>
</xsl:choose>
<xsl:sort select="$date"/>
(formatting here)
</xsl:for-each>
...
现在,我的XSLT如下所示:
<elements>
<element createdDate="01/02/2001" modifiedDate="01/03/2001"/>
<element createdDate="01/02/2001"/>
<element createdDate="01/02/2001" modifiedDate="01/01/2001"/>
...
</elements>
<xsl:for-each select="/element">
<xsl:variable name="date">
<xsl:choose>
<xsl:when test="@modifiedDate">
<xsl:value-of select="@modifiedDate"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@createdDate"/>
</xsl:otherwise>
</xsl:choose>
<xsl:sort select="$date"/>
(formatting here)
</xsl:for-each>
(此处格式化)
但是排序无法识别变量日期。首先,您必须从
中删除前导斜杠/
,因为元素
不是根元素
我提出的一个解决方案是连接日期。这样,如果@modifiedDate
不存在,则@createdDate
将移动到比较字符串的前面
<xsl:for-each select="element">
<xsl:sort select="concat(@modifiedDate, @createdDate)" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
首先,必须从
中删除前导斜杠/
,因为元素
不是根元素
我提出的一个解决方案是连接日期。这样,如果@modifiedDate
不存在,则@createdDate
将移动到比较字符串的前面
<xsl:for-each select="element">
<xsl:sort select="concat(@modifiedDate, @createdDate)" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
在XSLT2中,您可以编写
<xsl:for-each select="element">
<xsl:sort select="(@modifiedDate, @createdDate)[1]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
或者,如果您仍在使用XSLT1,则可以使用
<xsl:for-each select="element">
<xsl:sort select="@modifiedDate|@createdDate[not(../@modifiedDate)]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
在XSLT2中,您可以编写
<xsl:for-each select="element">
<xsl:sort select="(@modifiedDate, @createdDate)[1]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
或者,如果您仍在使用XSLT1,则可以使用
<xsl:for-each select="element">
<xsl:sort select="@modifiedDate|@createdDate[not(../@modifiedDate)]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>