首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSL apply-带有排序的模板不排序

XSL apply-带有排序的模板不排序
EN

Stack Overflow用户
提问于 2022-05-17 18:06:28
回答 2查看 43关注 0票数 0

我有一个XML文档

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<document>
    <timeperiods>
        <timeperiod>
            <day>1</day>
            <period>1</period>
        </timeperiod>
        <timeperiod>
            <day>1</day>
            <period>2</period>
        </timeperiod>
        <timeperiod>
            <day>2</day>
            <period>1</period>
        </timeperiod>
        <timeperiod>
            <day>2</day>
            <period>2</period>
        </timeperiod>
    </timeperiods>
</document>

我正在申请XSL,如下所示

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:template match="/">
        <xsl:apply-templates select="/document/timeperiods">
            <xsl:sort select="number(period)" data-type="number" order="descending"/>
            <xsl:sort select="number(day)" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:template>
    
    <xsl:template match="timeperiod">
        <xsl:value-of select="concat(period, '-', day, ' ')"/>
    </xsl:template>
</xsl:stylesheet>

我希望我的模板timeperiod会产生1-1 1-2 2-1 2-2,但是它会导致1-1 2-1 1-2 2-2,这是XML中的原始顺序。

我使用number()函数以及属性data-typeorder,但是无论我应用了哪个变体,我总是得到相同的结果。

我在这里错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-18 08:07:20

要想得到你期望的结果,改变一下:

代码语言:javascript
复制
    <xsl:apply-templates select="/document/timeperiods">
        <xsl:sort select="number(period)" data-type="number" order="descending"/>
        <xsl:sort select="number(day)" data-type="number" order="descending"/>
    </xsl:apply-templates>

至:

代码语言:javascript
复制
    <xsl:apply-templates select="/document/timeperiods/timeperiod">
        <xsl:sort select="period" data-type="number" order="ascending"/>
        <xsl:sort select="day" data-type="number" order="ascending"/>
    </xsl:apply-templates>

或者简单地做:

XSLT2.0

代码语言:javascript
复制
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
    
<xsl:template match="/document">
    <xsl:for-each select="timeperiods/timeperiod">
        <xsl:sort select="period" data-type="number" order="ascending"/>
        <xsl:sort select="day" data-type="number" order="ascending"/>
        <xsl:value-of select="period, day" separator="-"/>
        <xsl:text> </xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
票数 1
EN

Stack Overflow用户

发布于 2022-05-17 18:14:38

只有一个名为timeperiods的元素,对长度序列进行排序是没有用的。

您希望对timeperiod元素进行排序,因此应该选择这些元素。您还没有给出xsl:apply-templates指令的上下文;显然,这将影响您选择它们的方式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72278758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档