2

Altova XML Spy で先頭のゼロを削除するための構築は正常に機能しました。Saxon-HE 9.4 Java で例外が発生しました:

question.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>

回避策があります。質問は理論的なものです。たぶん、特殊文字を使用する必要がありますか?

4

2 に答える 2

3

Saxon は、XPath 仕様で定義されている正規表現の構文に厳密に従っています。他のエンジンの中には、よりリベラルで、たまたま使用している正規表現ライブラリで許可されているものは何でも許可するものもあります。構文 (?!$) は、XPath 仕様では許可されていません。

Perl では、(?!$) は、文字列の末尾を除くすべてに一致するゼロ幅の負の先読みアサーションです。それがあなたの心にあった意味だと思います。そう

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

文字列の末尾にない限り、文字列の先頭にあるゼロのシーケンスを削除します。たとえば、000 を 000 のままにして、0012 を 12 に変更します。これは少し奇妙な要件のように思えます。通常、重要でないゼロをすべて削除するために string(xs:integer(.)) を使用するだけですが、これには「000」をそのままにしておく性質。それが本当に必要な場合は、おそらく文字列の末尾に「Z」を追加してから、replace($x, '^0+[^Z]', '') を実行すると、ニーズを満たすことができます。

于 2013-08-09T19:11:51.597 に答える