Xslt XSL对来自不同节点的编号进行排序

Xslt XSL对来自不同节点的编号进行排序,xslt,sorting,Xslt,Sorting,我需要根据xml源中不同节点中的数字构造一个字符串,但需要注意的是,datarate节点顺序将是随机的,并且起始数字必须至少以600开头。如果没有600,那么从800开始 <datarate rate="200" /> <datarate rate="600" /> <datarate rate="300" /> <datarate rate="400" /> <datarate rate="800" /> <datarate r

我需要根据xml源中不同节点中的数字构造一个字符串,但需要注意的是,datarate节点顺序将是随机的,并且起始数字必须至少以600开头。如果没有600,那么从800开始

<datarate rate="200" />
<datarate rate="600" />
<datarate rate="300" />
<datarate rate="400" />
<datarate rate="800" />
<datarate rate="1000" />

http://example.com/src/600/800/

http://example.com/src/600/800/
我试过按组排序,但没有用。有人有主意吗


谢谢你能提供的任何帮助

如果您预先知道阈值数,您可以进行如下非常简单的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//datarate">
            <xsl:sort select="@rate" data-type="number"/>
        </xsl:apply-templates>
    </xsl:template> 

    <xsl:template match="datarate[@rate &lt; 600]"/>

    <xsl:template match="datarate">
        [<xsl:value-of select="@rate"/>]
    </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" encoding="UTF-8"/>

   <xsl:variable name="threshold">
       <xsl:choose>
           <xsl:when test="//datarate[@rate = 600]">600</xsl:when>
           <xsl:otherwise>800</xsl:otherwise>
       </xsl:choose>
   </xsl:variable>

   <xsl:template match="/">
       <xsl:apply-templates select="//datarate">
           <xsl:sort select="@rate" data-type="number"/>
       </xsl:apply-templates>
   </xsl:template>  

   <xsl:template match="datarate[@rate &lt; $threshold]"/>

   <xsl:template match="datarate">
       [<xsl:value-of select="@rate"/>]
   </xsl:template>
</xsl:stylesheet>
在这种情况下,可能既没有
600
也没有
800
,您可能需要向
$threshold
变量声明添加更多的逻辑


p、 s.没有关于如何构造字符串的详细信息,我只是打印了
[]

中包含的
@rate
值,如果您预先知道阈值,您可以执行如下非常简单的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//datarate">
            <xsl:sort select="@rate" data-type="number"/>
        </xsl:apply-templates>
    </xsl:template> 

    <xsl:template match="datarate[@rate &lt; 600]"/>

    <xsl:template match="datarate">
        [<xsl:value-of select="@rate"/>]
    </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" encoding="UTF-8"/>

   <xsl:variable name="threshold">
       <xsl:choose>
           <xsl:when test="//datarate[@rate = 600]">600</xsl:when>
           <xsl:otherwise>800</xsl:otherwise>
       </xsl:choose>
   </xsl:variable>

   <xsl:template match="/">
       <xsl:apply-templates select="//datarate">
           <xsl:sort select="@rate" data-type="number"/>
       </xsl:apply-templates>
   </xsl:template>  

   <xsl:template match="datarate[@rate &lt; $threshold]"/>

   <xsl:template match="datarate">
       [<xsl:value-of select="@rate"/>]
   </xsl:template>
</xsl:stylesheet>
在这种情况下,可能既没有
600
也没有
800
,您可能需要向
$threshold
变量声明添加更多的逻辑


p、 没有关于如何构造字符串的详细信息,我只是打印了
[]

中包含的
@rate
值,使用XSLT 2可以执行以下操作:

<xsl:template match="/">
   <xsl:for-each select="//datarate[number(@rate) ge 600]">
      <xsl:sort select="@rate" data-type="number"/>
      <xsl:value-of select="@rate"/>
      <xsl:if test="not(position() eq last())">
         <xsl:text>, </xsl:text>
      </xsl:if>
   </xsl:for-each>
</xsl:template>

, 

使用XSLT 2,您可以执行以下操作:

<xsl:template match="/">
   <xsl:for-each select="//datarate[number(@rate) ge 600]">
      <xsl:sort select="@rate" data-type="number"/>
      <xsl:value-of select="@rate"/>
      <xsl:if test="not(position() eq last())">
         <xsl:text>, </xsl:text>
      </xsl:if>
   </xsl:for-each>
</xsl:template>

, 

这个简短而简单的转换(根本没有使用明确的条件指令——没有
xsl:choose
,没有
xsl:when
,没有
xsl:other
):


应用于提供的XML文档时(包装到一个顶部元素中,格式良好):


生成所需的正确结果

<t>
   <datarate rate="600"/>
   <datarate rate="800"/>
   <datarate rate="1000"/>
</t>

应用于以下稍微更改的XML文档时(没有比率为600,但比率为601和650):


再次生成正确的结果:

<t>
   <datarate rate="800"/>
   <datarate rate="1000"/>
</t>

这个简短而简单的转换(根本没有使用明确的条件指令——没有
xsl:choose
,没有
xsl:when
,没有
xsl:other
):


应用于提供的XML文档时(包装到一个顶部元素中,格式良好):


生成所需的正确结果

<t>
   <datarate rate="600"/>
   <datarate rate="800"/>
   <datarate rate="1000"/>
</t>

应用于以下稍微更改的XML文档时(没有比率为600,但比率为601和650):


再次生成正确的结果:

<t>
   <datarate rate="800"/>
   <datarate rate="1000"/>
</t>



能否提供一个具体示例,说明您希望字符串的外观?另外,您使用的是XSLT/XPath 1.0还是2.0?能否提供一个具体示例,说明您希望字符串的外观?另外,您使用的是XSLT/XPath 1.0还是2.0?您仍然需要围绕“600”或“800”条件执行一些if/then/else,对吗?有了XSLT 2.0,您可以利用
xsl:value的
分隔符
,而不要在
position()附近使用XSLT 1.0惯用语last()
@Pavel Veller:你的意思是“如果/然后/否则”吗?给出的结果是“6008001000”。另外,我不太明白
separator
有什么帮助,因为每个
xsl:value
都在一个项目上运行。关于
中每个
xsl:value
,您是对的。if/then/else与@hybrid9需求相关
如果没有600,则从800开始。我想如果没有600、650或750的话it@PavelVeller:不管值600是否存在,给定的解决方案都有效。它确实有效,直到其中某个地方出现
650
:)只需稍微修改一下输入。也许我误解了
800
600
阈值的要求。不管怎样,这并不重要。无论哪种方法,解决方案都非常简单。在“600”或“800”条件下,您仍然需要执行一些if/then/else,对吗?有了XSLT 2.0,您可以利用
xsl:value的
分隔符
,而不要在
position()附近使用XSLT 1.0惯用语last()
@Pavel Veller:你的意思是“如果/然后/否则”吗?给出的结果是“6008001000”。另外,我不太明白
separator
有什么帮助,因为每个
xsl:value
都在一个项目上运行。关于
中每个
xsl:value
,您是对的。if/then/else与@hybrid9需求相关
如果没有600,则从800开始。我想如果没有600、650或750的话it@PavelVeller:不管值600是否存在,给定的解决方案都有效。它确实有效,直到其中某个地方出现
650
:)只需稍微修改一下输入。也许我误解了
800
600
阈值的要求。不管怎样,这并不重要。无论哪种方法,解决方案都非常简单。很好。。。只有当您将第一次输入更改为使用
650
而不是
600
时,才会将其打印出来。我了解原始需求,因此如果没有
600
,新的阈值是
800
。你必须在某个地方有一个条件:)不是吗?我理解这样一个要求,如果有600和800,那么结果将从800开始。@Pavel Veller:好的,看来你对这个问题的理解是正确的