Нахождение макс. Трех чисел в XSL - PullRequest
1 голос
/ 23 апреля 2009

Как найти максимум три числа в 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 ]

2 голосов
/ 23 апреля 2009

С вашим входным 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 голос
/ 23 апреля 2009

Этот вопрос сформулирован неверно, а предоставленный "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>, , используйте функцию f:maximum() FXSL.

0 голосов
/ 23 апреля 2009

5,0 является самым большим из трех чисел. Жесткий код и покончим с этим. : -)

Серьезно, вы можете пойти другим путем. Подобная логика тривиальна в других языках, но может быть проблемой в XSLT. Вы должны написать простое расширение для движка XSLT, а не возиться с попытками заставить XSLT делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...