Xml 对子树进行排序并将其存储在xsl:variable中

Xml 对子树进行排序并将其存储在xsl:variable中,xml,xslt,saxon,Xml,Xslt,Saxon,我正在使用XSL样式表,并尝试使用所示的方法将排序子树存储为变量。我正在使用Saxon8.7VisXMLMaven插件来转换我的xml文件。以下是我的代码: <xsl:variable name="miniDays"> <xsl:for-each select="//day[position() > $firstPosToShow]"> <xsl:sort select="@date" order="descending" />

我正在使用XSL样式表,并尝试使用所示的方法将排序子树存储为变量。我正在使用Saxon8.7VisXMLMaven插件来转换我的xml文件。以下是我的代码:

<xsl:variable name="miniDays">
    <xsl:for-each select="//day[position() > $firstPosToShow]">
        <xsl:sort select="@date" order="descending" />
        <xsl:copy-of select=".|@*" />
    </xsl:for-each>
</xsl:variable>
如果我只是将子树设置为变量而不进行排序,则它可以工作,但没有排序:

<xsl:variable name="miniDays" select="//day[position() > $firstPosToShow]" />
职能:

<xsl:function name="local:calculate-total-in-days">
    <xsl:param name="days" as="element()*" />
    <!-- Do some calculations -->
</xsl:function>


我是否错误地使用exsl:节点集?您的代码中有许多问题

<xsl:for-each select="exsl:node-set($miniDays)/*"> 
    <xsl:variable name="in" select="local:calculate-total-in-days(.)" /> 
    <!-- do some stuff with the var --> 
</xsl:for-each>
<xsl:for-each select="$miniDays/*"> 
    <xsl:variable name="in" select="local:calculate-total-in-days(.)" /> 
    <!-- do some stuff with the var --> 
</xsl:for-each>
  • 。这将选择文档中的每个
    日期
    元素,该元素位于其父
    日期
    集合中的
    $firstPosToShow+1
    或更大的位置!很可能您想要
    (//day)[position()>=$firstPosToShow]

  • 。这会复制当前元素,但也会复制其属性。只有当父项是元素时,才能复制属性。情况并非如此,因为非类型化变量中的操作会创建临时树(文档),文档节点不能具有属性。正确的说明是:

  • 在以下代码中列出项目:

  • 表达式
    exsl:node set($miniDays)
    的类型也是
    document-node()
    ,而
    只选择一个(此)节点。这解释了引发的错误,因为
    local:calculate total in days(.)
    需要一个元素参数,但传递给文档节点

    正确的代码是

    <xsl:for-each select="exsl:node-set($miniDays)/*"> 
        <xsl:variable name="in" select="local:calculate-total-in-days(.)" /> 
        <!-- do some stuff with the var --> 
    </xsl:for-each>
    
    <xsl:for-each select="$miniDays/*"> 
        <xsl:variable name="in" select="local:calculate-total-in-days(.)" /> 
        <!-- do some stuff with the var --> 
    </xsl:for-each>
    

    < >强> >可替换< <强> >,您可以考虑指定< <代码> $MIDIDAs/COD>显式为“代码> EntEnter())/<代码>,这将简化代码——不必使用<代码> $MIDIDY/*——只是代码> $MIDIDAs< /Calp>

    向我们展示足够多的输入XML,以便能够知道发生了什么。好问题(+ 1). 请参阅我的答案,以深入讨论代码中的问题,并了解每个问题的解决方案。
    <xsl:for-each select="$miniDays/*"> 
        <xsl:variable name="in" select="local:calculate-total-in-days(.)" /> 
        <!-- do some stuff with the var --> 
    </xsl:for-each>