2017-01-18 21 views
0

Я хочу получить код для узла medias с наименьшим индексом. Источник XML выглядит примерно так:XSLT математика: min() в списке не работает во время сортировки

<item> 
    <medias> 
     <index>999997</index> 
     <code>0001</code> 
    </medias> 
    <medias> 
     <index>1</index> 
     <code>0002</code> 
    </medias> 
    <medias> 
     <index>999998</index> 
     <code>0003</code> 
    </medias> 
    <medias> 
     <index>999999</index> 
     <code>0004</code> 
    </medias> 
</item> 

В моей XSLT Я попытался это:

<xsl:variable name="minIndex" select="math:min(item/medias/index)" /> 
<xsl:value-of select="item/medias[index=$minIndex]/code" /> 

Но по какой-то причине, переменная minIndex не получает наименьшее значение всех значений, а просто значение первого узла, в данном случае 999997.

При сортировке узлов, хотя значения упорядочены правильно:

<xsl:for-each select="item/medias"> 
    <xsl:sort select="index" /> 
    <xsl:value-of select="." /><xsl:text>,</xsl:text> 
</xsl:for-each> 

Это выводит:

1,999997,999998,999999 

Есть ли что-то еще, что я должен заботиться о при использовании math:min? Я также попытался добавить /text() в конце моего выбора (после index), но это тоже не сработало.

EDIT: Я построение моего XSL трансформатора в Java, используя только этот код и придав ему файл XSLT в качестве источника:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xsltSource); 
+1

Как объявляется префикс пространства имен 'math'? Он предполагает, что вы используете функцию расширения. Однако вы отметили этот XSLT 2.0, но 'min' - встроенная функция XPath 2.0, поэтому вы можете просто выполнить' ' –

+0

См. Http://xsltransform.net/ncntCSF, где предложение Тима прекрасно работает. –

+0

Он также отлично работает при использовании расширения Exslt math. См. Http://xsltransform.net/pPJ8LVH. Можете ли вы сказать, какой именно процессор XSLT вы используете? Благодаря! –

ответ

0

При явном указании имен для использования расширений EXSLT, как math:min и math:lowest выполните эту работу.

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:math="http://exslt.org/math"> 
             ... 
+0

Выполняет только работу, если XSLT-процессор поддерживает эти функции расширения.И поскольку вы, очевидно, используете процессор XSLT 1.0, вы не должны объявлять 'version =" 2.0 "'. –

0

math:min(...) Используется, например, в Java (точно - math.min(...)).

Напишите только min(...).

Я попробовал это и получил правильный результат.

+0

'math: min()' не в Java, это функция расширения EXSLT. И вы можете использовать только 'min()', если вы используете процессор XSLT 2.0, который OP явно не является. –