Xml 对子树进行排序并将其存储在xsl:variable中
我正在使用XSL样式表,并尝试使用所示的方法将排序子树存储为变量。我正在使用Saxon8.7VisXMLMaven插件来转换我的xml文件。以下是我的代码: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: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>