删除前导零的构造在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>
我有解决方法,问题是理论上的。 也许,必须使用特殊字符?
答案 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-syntax和http://www.w3.org/TR/xmlschema-2/#regexs中给出。我认为不允许(?!$)
。