寻找最大的三个数字的XSL(Finding max of three numbers in XSL)

2019-10-16 13:55发布

如何才能找到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>

Answer 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 soulution):

<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>却使用了f:maximum() FXSL的功能。



Answer 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


Answer 3:

5.0是最大的三个数字。 硬编码,并用它做。 :-)

说正经的,你不妨采取另一种路径。 这样的逻辑在其他语言的琐碎,但可以在XSLT痛苦。 你应该考虑写XSLT引擎的简单扩展,而不是瞎搞试图使XSLT你希望它是什么。



文章来源: Finding max of three numbers in XSL
标签: xslt