Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 条件排序_Xslt - Fatal编程技术网

Xslt 条件排序

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"/>

我试图根据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>
<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>