XPST0017 Xpath语法错误

时间:2017-01-18 12:45:00

标签: xslt saxon

我试图运行一个脚本来从xml字段中提取最后2个0的组合,并用10到60之间的随机数替换它们。

然而出现以下错误

XPST0017:{randomnr:rand()}中第31行的char 15处的XPath语法错误:

找不到名为{uri:nonexistant} rand()

的匹配0参数函数 我做错了什么?我知道除了javascript调用之外的所有内容都可以使用

        <xsl:stylesheet version="2.0" xmlns:randomnr="uri:nonexistant"    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:package="info:srw/extension/13/package-v1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:saxon="uri:http://saxon.sf.net/">
      <xsl:output omit-xml-declaration="yes" indent="yes" />
          <saxon:script language="JavaScript" implements-prefix="randomnr">
            <![CDATA[
            function rand()
            {
                 return"" + Math.floor((Math.random() * 60) + 10);
             }
            ]]>
        </saxon:script>
      <xsl:variable name="basename">
      <xsl:call-template name="substring-before-last">
      <xsl:with-param name="string1" select="$filename" />
      <xsl:with-param name="string2" select="'00'" />
    </xsl:call-template>
  </xsl:variable>
     <xsl:value-of select="$basename" />
     <xsl:value-of select="randomnr:rand()"/>

2 个答案:

答案 0 :(得分:0)

撒克逊人有一些限制。

查看http://saxon.sourceforge.net/saxon7.9/extensions.html#saxon:script

它的内容如下:语言属性是必需的,必须取值“java”。 否则Saxon会忽略saxon:script元素。

我可以基于调用Java方法建议另一个解决方案:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:math="java.lang.Math">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:value-of select="math:floor((math:random() * 60) + 10)"/>
  </xsl:template>

</xsl:stylesheet>

我在http://xsltransform.net/上尝试过,发现它适用于 Xalan Saxon 6.5.5 模式。 不幸的是,在 Saxon HE Saxon EE 模式中,它失败了。

请注意, math 名称空间指向完全限定的Java类名。

答案 1 :(得分:0)

你做错了什么?您正在咨询一些非常古老的文档(可能从它实际上的内容中推断出来)。可能有一段时间撒克逊:脚本存在,但(a)很久以前,(b)它从不支持调用Javascript。