我尝试根据内容对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>
(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>
现在我的XSLT看起来像这样:
<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>
但排序并未认识到变量日期。
答案 0 :(得分:1)
首先,您必须从/
中删除前导斜杠<xsl:for-each select="/element">
,因为element
不是根元素。
我提出的一个解决方案是连接日期。如果@createdDate
不存在,这种方式@modifiedDate
会移动到比较字符串的前面。
<xsl:for-each select="element">
<xsl:sort select="concat(@modifiedDate, @createdDate)" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
答案 1 :(得分:1)
在xslt 2中你可以写
<xsl:for-each select="element">
<xsl:sort select="(@modifiedDate, @createdDate)[1]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>
或者如果您仍在使用xslt 1,则可以使用
<xsl:for-each select="element">
<xsl:sort select="@modifiedDate|@createdDate[not(../@modifiedDate)]" order="descending" />
<xsl:copy-of select="." />
</xsl:for-each>