XPath-запрос для возврата элемента с максимальной длиной в значении - PullRequest
0 голосов
/ 24 октября 2011

Приведен список элементов, содержащих текст:

<root>
  <element>text text text ...</element>
  <element>text text text ...</element>
<root>

Я пытаюсь написать запрос XPath 1.0, который вернет элемент с максимальной длиной текста.

К сожалению, string-length () возвращает один результат, а не набор, поэтому я не уверен, как этого добиться.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

Я пытаюсь написать запрос XPath 1.0, который вернет элемент с максимальной длиной текста

Если количество элементов заранее не известно, невозможно написать одно выражение XPath 1.0, которое выбирает элемент, для которого string-length () является максимальным.

В XPath 2.0 это тривиально :

/*/element[string-length() eq max(/*/element/string-length())]

или другой способ указать это, используя общее сравнение = оператор:

/*/element[string-length() = max(/*/element/string-length())]
1 голос
/ 24 октября 2011

Невозможно достичь с помощью чистого XPath 1.0.

0 голосов
/ 12 января 2018

Я знаю, что это старый вопрос, но, поскольку я нашел его, когда искал встроенное решение для XPath 1.0, возможно, мое предложение может быть полезным для кого-то другого, также ищущего решение для максимальной длины.

Если в таблице стилей XSLT требуется значение максимальной длины, его можно найти с помощью шаблона:

<!-- global variable for cases when target nodes in different parents. -->
<xsl:variable name="ellist" select="/root/element" />
<!-- global variable to avoid repeating the count for each iteration. -->
<xsl:variable name="elstop" select="count($ellist)+1" />

<xsl:template name="get_max_element">
   <xsl:param name="index" select="1" />
   <xsl:param name="max" select="0" />
   <xsl:choose>
      <xsl:when test="$index &lt; $elstop">
         <xsl:variable name="clen" select="string-length(.)" />
         <xsl:call-template name="get_max_element">
            <xsl:with-param name="index" select="($index)+1" />
            <xsl:with-param name="max">
               <xsl:choose>
                  <xsl:when test="$clen &gt; &max">
                     <xsl:value-of select="$clen" />
                  </xsl:when>
                  <xsl:otherwise>
                     <xsl:value-of select="$max" />
                  </xsl:otherwise>
               </xsl:choose>
            </xsl:with-param>
         </xsl:call-template>
      </xsl:when>
      <xsl:otherwise><xsl:value-of select="$max" /></xsl:otherwise>
   </xsl:choose>
</xsl:template>

`

...