XSL条件排序

时间:2018-01-12 00:52:24

标签: 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>

(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>

但排序并未认识到变量日期。

2 个答案:

答案 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>