#xml #xpath #string-length
#xml #xpath #длина строки
Вопрос:
Задан список элементов, содержащих текст:
<root>
<element>text text text ...</element>
<element>text text text ...</element>
<root>
Я пытаюсь написать запрос XPath 1.0, который вернет элемент с максимальной длиной текста.
К сожалению, string-length() возвращает один результат, а не набор, поэтому я не уверен, как это сделать.
Спасибо.
Ответ №1:
Я пытаюсь написать запрос 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())]
Ответ №2:
Это невозможно выполнить, используя чистый XPath 1.0.
Ответ №3:
Я знаю, что это старый вопрос, но поскольку я нашел его, когда искал встроенное решение 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 amp;< $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 amp;> amp;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>
`