如何在XSL中找到最多三个数字? 更多信息:我有三个数字说1.0,2.0,5.0 ....我没有设置任何节点...我想找到最大值1.0,2.0和5.0 ......
示例:
AIM : TO know which type of node <MYNODE>, <DOC>, <PIC>
is having maximum count and whant's the count number ?
<ROOT>
<MYNODES>
<MYNODE>A</MYNODE>
<MYNODE>B</MYNODE>
<MYNODE>C</MYNODE>
<MYNODE>D</MYNODE>
</MYNODES>
<DOCS>
<DOC>1</DOC>
<DOC>2</DOC>
<DOC>3</DOC>
</DOC>
<PICS>
<PIC>a.jpeg</PIC>
<PIC>b.jpeg</PIC>
<PIC>c.jpeg</PIC>
<PIC>d.jpeg</PIC>
<PIC>e.jpeg</PIC>
</PICS>
</ROOT>
答案 0 :(得分:2)
使用您的输入XML,您可以找到您要查找的最大数量:
<xsl:variable name="vMaxChildren">
<xsl:for-each select="/ROOT/*">
<xsl:sort select="count(*)" data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="concat(name(), ': ', count(*))" />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="$vMaxChildren" />
哪会产生:
PICS: 5
答案 1 :(得分:1)
这个问题制定错误,提供的“XML文档”格式不正确!
请注意询问 一组数字的最大值通常没有意义。可以有多个具有最高值的数字。因此,下面的解决方案仅显示具有最大值的第一个项目。
这是一种可能的XSLT 1.0解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vNameMaxCount">
<xsl:for-each select="*/*">
<xsl:sort select="count(*)" data-type="number"
order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="concat(name(),'+', count(*))"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
One element with maximum children is: <xsl:text/>
<xsl:value-of select="substring-before($vNameMaxCount, '+')"/>
Maximum number of children: <xsl:text/>
<xsl:value-of select="substring-after($vNameMaxCount, '+')"/>
</xsl:template>
</xsl:stylesheet>
将以上转换应用于以下XML文档(从花费10分钟后提供的文档生成,以使其格式正确!):
<ROOT>
<MYNODES>
<MYNODE>A</MYNODE>
<MYNODE>B</MYNODE>
<MYNODE>C</MYNODE>
<MYNODE>D</MYNODE>
</MYNODES>
<DOCS>
<DOC>1</DOC>
<DOC>2</DOC>
<DOC>3</DOC>
</DOCS>
<PICS>
<PIC>a.jpeg</PIC>
<PIC>b.jpeg</PIC>
<PIC>c.jpeg</PIC>
<PIC>d.jpeg</PIC>
<PIC>e.jpeg</PIC>
</PICS>
</ROOT>
生成了想要的结果
One element with maximum children is: PICS
Maximum number of children: 5
XSLT 2.0解决方案(实际上只是一个XPath 2.0解决方案):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select=
"for $vmaxChildrein in max(/*/*/count(*)),
$vmaxNode in */*[count(*) = $vmaxChildrein][1]
return
(name($vmaxNode),
'has the max no of children:',
$vmaxChildrein
)
"/>
</xsl:template>
</xsl:stylesheet>
在上述文档中应用此转换时,会生成所需结果:
PICS has the max no of children: 5
要查找无法立即表示为XPath表达式并在<xsl:sort>
中使用的最多棘手属性,请使用FXSL的f:maximum()
函数强>
答案 2 :(得分:0)
5.0是三个数字中最大的一个。硬编码并完成它。 : - )
说真的,你可能想采取另一条道路。像这样的逻辑在其他语言中是微不足道的,但在XSLT中可能是一种痛苦。你应该考虑为XSLT引擎编写一个简单的扩展,而不是试图让XSLT做你想要的。