Xml xslt在已排序数据上应用模板
我是xslt转换新手,在这方面遇到了一些问题。 我需要对元素进行排序和筛选,在下面的示例中,我使用两个xlt转换对输入xml进行排序和筛选。 我的问题是:如何使用单个xsl文件对排序后的数据进行排序和过滤? 提前谢谢 XML输入:Xml xslt在已排序数据上应用模板,xml,sorting,xslt,filter,Xml,Sorting,Xslt,Filter,我是xslt转换新手,在这方面遇到了一些问题。 我需要对元素进行排序和筛选,在下面的示例中,我使用两个xlt转换对输入xml进行排序和筛选。 我的问题是:如何使用单个xsl文件对排序后的数据进行排序和过滤? 提前谢谢 XML输入: 00000_1111_2222 2017-08-21T11:55:08.382Z 2017-08-21T12:07:08.539Z 2017-08-21T11:55:28.041Z 40.2407009 10.7750499 2017-08-21T11:55:28
00000_1111_2222
2017-08-21T11:55:08.382Z
2017-08-21T12:07:08.539Z
2017-08-21T11:55:28.041Z
40.2407009
10.7750499
2017-08-21T11:55:28.041Z
40.2409364
10.7748426
2017-08-21T11:55:38.041Z
40.240409
10.7751432
给定您可以使用的XSLT 2.0
<xsl:variable name="sorted-positions" as="element(positions)*">
<xsl:perform-sort select="positions">
<xsl:sort select="timestamp" order="descending"/>
</xsl:perform-sort>
</xsl:variable>
谢谢你的回答,只有一件事:如果我保留原始的xml文件结构?如何保留其他节点?我将在editWell中举一个例子,您最初的方法以及您的注释都有一种方法,即在希望处理其他子节点的位置放置一个附加的
apply templates
。至于一个更通用的解决方案,我认为如果你问一个显示一些输入样本的新问题会更好,我认为我们需要了解输入可能存在哪些变化(在位置之前和/或之后的内容
,与位置混合的内容
),然后你想如何重新排列元素(所有位置
一起?). 还请明确说明是否可以使用XSLT2.0。
<xsl:apply-templates select="positions">
<xsl:sort select="timestamp" order="descending"/>
</xsl:apply-templates>
<xsl:template match="positions">
<xsl:if test="position() le 4">
<xsl:next-match/>
</xsl:if>
</xsl:template>
<xsl:for-each select="positions">
<xsl:sort select="timestamp" order="descending"/>
<xsl:if test="position() <= 4">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
<xsl:template match="data">
<xsl:copy>
<xsl:apply-templates select="* except positions, reverse(sort(positions, (), function($p) { $p/timestamp}))[position() le 4]"/>
</xsl:copy>
</xsl:template>