由于未知原因,最大功能不起作用。
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
答案 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>