Xml 列表上的XSLT math:min()不起作用,而排序起作用

Xml 列表上的XSLT math:min()不起作用,而排序起作用,xml,xslt,xpath,xslt-1.0,javax.xml,Xml,Xslt,Xpath,Xslt 1.0,Javax.xml,我想获取索引最低的媒体节点的代码。源XML与此类似: <item> <medias> <index>999997</index> <code>0001</code> </medias> <medias> <index>1</index> <code>0002</code&g

我想获取索引最低的
媒体
节点的代码。源XML与此类似:

<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" />
这将产生:

1,999997,999998,999999
在使用
math:min
时,我是否还需要注意其他事项?我还尝试将
/text()

编辑:我正在用Java构建XSL转换器,只需使用以下代码,并将XSLT文件作为源代码:

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

当显式指定要使用EXSLT扩展的命名空间时,
math:min
math:lower
都会执行此任务

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

...
math:min(…)
例如在Java中使用(精确地说是-
math.min(…)

只写
min(…)


我试了一下,得到了正确的结果。

名称空间前缀
math
是如何声明的?它表明您正在使用扩展函数。然而,您已经标记了这个XSLT 2.0,但是
min
是一个内置的XPath 2.0函数,因此您只需执行
即可查看Tim的建议在何处运行良好。在使用Exslt数学扩展时,它似乎也运行良好。看见您能确切地说出您使用的是什么XSLT处理器吗?谢谢对不起,问题中缺少信息。
math
名称空间似乎是由Java提供的;只需使用不带前缀的
min
即可告诉我此函数不存在:(您可以发布一个最小但完整的样式表吗?使用
效果更好吗?只有当XSLT处理器支持这些扩展函数时,它才起作用。而且,由于您显然使用的是XSLT 1.0处理器,因此不应该声明
version=“2.0”
math:min()
不在Java中,它是一个EXSLT扩展函数。如果您使用的是XSLT 2.0处理器,则只能使用
min()
,而这显然不是。
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:math="http://exslt.org/math">
                                       ...