为什么XSLT前瞻模式在Saxon-HE 9.4 java中不起作用

时间:2013-08-09 09:52:21

标签: xslt saxon

删除前导零的构造在Altova XML Spy中运行良好。 使用Saxon-HE 9.4 java得到例外:

  

问题xslt的第6行第59行的xsl:value-of出错:    FORX0002:正则表达式中的字符4出错“^ 0 +(?!$)”:expected())

代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <result>
            <xsl:value-of select="replace('00012','^0+(?!$)','')"/>
        </result>
    </xsl:template>
</xsl:stylesheet>

我有解决方法,问题是理论上的。 也许,必须使用特殊字符?

2 个答案:

答案 0 :(得分:2)

Saxon严格遵守XPath规范中定义的正则表达式的语法。其他一些引擎可能更自由,并允许它们恰好使用的正则表达式库允许的任何内容。 XPath规范中不允许使用语法(?!$)。

在Perl中,(?!$)是一个零宽度负前瞻断言,它匹配除字符串末尾之外的所有内容。我想这就是你想到的意思。所以

replace('00012','^0+(?!$)','')

会删除字符串开头的任何零序列,前提是它不在字符串的末尾。例如,它会将0012更改为12,同时将000保留为000.这似乎是一个非常奇怪的要求:通常我会使用字符串(xs:integer(。))来删除所有无关紧要的零,但是这没有离开'000'的财产完好无损。如果这真的是你需要做的,那么可能在字符串末尾添加一个'Z'然后执行replace($ x,'^ 0 + [^ Z]','')就可以满足需要。

答案 1 :(得分:1)

XSLT / XPath 2.0中正则表达式的语法在http://www.w3.org/TR/xpath-functions/#regex-syntaxhttp://www.w3.org/TR/xmlschema-2/#regexs中给出。我认为不允许(?!$)