2

删除前导零的构造在 Altova XML Spy 中运行良好。使用 Saxon-HE 9.4 java 时出现异常:

xsl:value-of 在 question.xslt 的第 6 行第 59 列出错:FORX0002:正则表达式“^0+(?!$)”中字符 4 处出错:预期 ())

代码:

<?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>

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

4

2 回答 2

3

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

于 2013-08-09T10:06:37.543 回答
3

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

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

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

将删除字符串开头的任何零序列,前提是它不在字符串的末尾。例如,它将 0012 更改为 12,而将 000 保留为 000。这似乎是一个有点奇怪的要求:通常我只会使用 string(xs:integer(.)) 删除所有无关紧要的零,但这没有保持'000'完好无损的属性。如果这确实是您需要做的,那么也许在字符串末尾附加一个 'Z' 然后执行 replace($x, '^0+[^Z]', '') 将满足需要。

于 2013-08-09T19:11:51.597 回答