這是有效的,但利用模式和最大長度,以強制執行複製的長度的限制:XSD長度限制選項
<xsd:simpleType name="MyType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{0,10}" />
<xsd:maxLength value="10" />
</xsd:restriction>
</xsd:simpleType>
單獨的模式就足夠了:
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{0,10}" />
</xsd:restriction>
或者該模式可以簡化,我們將依靠最大長度:
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]*" />
<xsd:maxLength value="10" />
</xsd:restriction>
問題:
是否有已知的性能影響選擇其中之一? 任何給定的解析器在編譯模式之前首先檢查len並短路驗證,如果兩者都被提供的話? 或者兩者都會在任何情況下檢查? 它從解析器到解析器有所不同嗎?
我承認這裏的性能差異可能是最小的。我也期望正則表達式引擎也可以短路,這是一個長度限制 - 但這比我可能關心的更深。
除了表現之外,我認爲我更喜歡在模式中使用它,但這可能會反映出我的舒適度與正則表達式而非典型的最佳做法。
謝謝!
避免選項1可能會導致矛盾維護(即,如果某人希望將最大長度改爲12個字符,只有更新的最大長度,而無需重新評估模式會有問題。選項3有最大長度的優勢是從可接受的字符清晰,獨特的 - 所以,如果這兩個都可能independantly彼此的改變,這是認知更加清晰(而對於像一個郵編你想要的圖案一切表明,模式和長度被鏈接) 。 – JohnLBevan
可悲的是,我不能回答你的問題的表現部分(超過答案因此評論)。我懷疑不同的解析器不同,雖然實現這個,給你不同的結果(一般最少)這是一個猜測,雖然 – JohnLBevan