xpath-function max不起作用

时间:2009-07-03 14:54:46

标签: xslt

由于未知原因,最大功能不起作用。

XML输入文件:

的test.xml

<?xml version="1.0" encoding="UTF-8"?>
<numbers>
    <number>3</number>
    <number>5</number>
    <number>10</number>
    <number>1</number>
</numbers>

XSL输入文件

test.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" >

    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/numbers">
        <numbers>       
            <xsl:value-of select="/numbers/number" />                   

            fn:max(2, 3)

        </numbers>
    </xsl:template> 

</xsl:stylesheet>

的Output.xml

<?xml version="1.0" encoding="UTF-8"?>

<numbers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fn="http://www.w3.org/2005/02/xpath-functions">3                   

            fn:max(2, 3)


        </numbers>

输入文件在这里并不重要,但我想要'3'而不是fn:max(2,3)。怎么做?

这个XSL文件:

<?xml version="1.0"?>

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" >

    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/numbers">
        <numbers>       
            <xsl:value-of select="/numbers/number" />                   

            fn:max(2, 3)
            <xsl:value-of select="max(/numbers/number)"/>

        </numbers>
    </xsl:template> 

</xsl:stylesheet>

发生以下错误:

SystemId未知;第13行;第49栏;无法找到功能:最大 SystemId未知;第13行;第49栏;找不到函数令牌。 (错误的位置未知)java.lang.NullPointerException

(错误的位置未知)XSLT错误(javax.xml.transform.TransformerException) :找不到xml-stylesheet PI:test.xml 线程“main”中的异常java.lang.RuntimeException:没有xml-stylesheet PI foun d in:test.xml         在org.apache.xalan.xslt.Process.doExit(Process.java:1155)         在org.apache.xalan.xslt.Process.main(Process.java:1128)

我使用了Xalan - Version Xalan Java 2.7.1,命令:java org.apache.xalan.xslt.Process -in test.xml -xsl test.xsl -out output.xml

4 个答案:

答案 0 :(得分:4)

有几个问题:max()需要在value-of中,并且你已经为Xalan说过xsl:stylesheet version="2.0",它只支持XSLT 1.0 。对于2.0,你需要Saxon 9.x。

由于max()不是XSLT 1.0的一部分,因此您需要调用Xalan确实具有的EXSLT扩展支持:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math">
    <xsl:template match="/numbers">
        <xsl:value-of select="math:max(number)"/>
    </xsl:template>
</xsl:stylesheet>

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math">
    <xsl:template match="/">
        <xsl:value-of select="math:max(numbers/number)"/>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:2)

您已将fn:max(2,3)放入文本块中。没有什么可以解释这一点。如果要对函数进行求值,则需要将函数放在value-of表达式中。

答案 2 :(得分:0)

拉维诺,

感谢您的回复。我不知道为什么,但我非常肯定Xalan支持2.0 ......我已经测试了它,它适用于Saxon 9.

答案 3 :(得分:0)

您可以使用

<xsl:value-of select="max(number)" />

获取所有数字的最大值。

溶液:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/numbers">
        <numbers>
            <max>
                <xsl:value-of select="max(number)"/>
            </max>
            <xsl:apply-templates/>
        </numbers>
    </xsl:template>

    <xsl:template match="number">
        <number>
            <xsl:value-of select="."/>
        </number>
    </xsl:template>

</xsl:stylesheet>

如果不需要,您可以省略数字模板和<xsl:apply-templates/>。这将是上面xslt:

的输出
<?xml version="1.0" encoding="UTF-8"?>
<numbers xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <max>10</max>
    <number>3</number>
    <number>5</number>
    <number>10</number>
    <number>1</number>
</numbers>