在XSL中查找最多三个数字

时间:2009-04-23 04:37:05

标签: xslt

如何在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>

3 个答案:

答案 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做你想要的。