我需要从位于xml源中不同节点的数字构造一个字符串,但需要注意的是数据速率节点顺序是随机的,起始数必须至少为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/
我尝试过根据群体进行排序,但无济于事。那里有人有想法吗?
感谢您提供的任何帮助!
答案 0 :(得分:1)
使用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>
答案 1 :(得分:0)
如果你事先知道门槛值,你可以做一个非常简单的转换:
<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>
因为如果找不到600
,您需要检查是否有800
并使用600
作为您的阈值,您可以这样:
<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
中包含的[]
值。
答案 2 :(得分:0)
这个简短而简单的转换(根本没有使用明确的条件指令 - 没有xsl:choose
,没有xsl:when
,没有xsl:otherwise
):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<t>
<xsl:apply-templates select="*">
<xsl:sort select="@rate" data-type="number"/>
</xsl:apply-templates>
</t>
</xsl:template>
<xsl:template match=
"datarate
[not(@rate >= 600)
or
not(../*[@rate = 600]) and not(@rate >= 800)
]"/>
</xsl:stylesheet>
应用于提供的XML文档(包装成单个顶部元素以使格式正确):
<t>
<datarate rate="200" />
<datarate rate="600" />
<datarate rate="300" />
<datarate rate="400" />
<datarate rate="800" />
<datarate rate="1000" />
</t>
生成想要的正确结果:
<t>
<datarate rate="600"/>
<datarate rate="800"/>
<datarate rate="1000"/>
</t>
应用于以下,稍微更改过的XML文档(无费率为600,但费率为601和650):
<t>
<datarate rate="200" />
<datarate rate="601" />
<datarate rate="650" />
<datarate rate="300" />
<datarate rate="400" />
<datarate rate="800" />
<datarate rate="1000" />
</t>
再次产生正确的结果:
<t>
<datarate rate="800"/>
<datarate rate="1000"/>
</t>