Xslt XSL对来自不同节点的编号进行排序
我需要根据xml源中不同节点中的数字构造一个字符串,但需要注意的是,datarate节点顺序将是随机的,并且起始数字必须至少以600开头。如果没有600,那么从800开始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
<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 < 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 < $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 < 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 < $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:好的,看来你对这个问题的理解是正确的