我在 xsd 模式 1.1 中创建了包含正则表达式的断言。这些表达式应该从元素值的开头排除罗马数字和后面有句点和空格的数字。根据我的阅读,我不需要将正则表达式锚定在 xsd 模式 b/c 中,它应该已经适用于开始(我可能误解了这一点)。我无法将正则表达式限制在开头。
XSD:
<xs:element name="node123">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:assertion test="not(matches($value, '[\d].*\.\s.|[I].*\.\s.*|[V].*\.\s.*|[X].*\.\s.*|[L].*\.\s.*|[C].*\.\s.*'))"/>
<xs:assertion test="not(starts-with($value, '-'))"/>
<xs:assertion test="not(starts-with($value, '–'))"/>
<xs:assertion test="not(starts-with($value, '—'))"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
误报是:
Fid 的困惑。 R.克里姆。 Z
发货货到付款
我不能将 starts-with 与根本不起作用的数字表达式 b/c 一起使用。但是,当我将 starts-with 与其他表达式一起使用时,它不适用于整个元素值。
有没有办法将表达式限制为仅第一个单词或元素的开头?
最佳答案
注意事项:
xsd:pattern
方面中的 XSD 正则表达式是在开始时隐式锚定 (^
)并结束 ($
)。xsd:assertion
中使用的 XPath 正则表达式不是隐式锚定。
鉴于上述情况,正则表达式 provided by @WiktorStribiżew (连同他尝试添加 ^
的建议)是您排除看起来像阿拉伯数字或罗马数字的字符串的合理近似值:
<xs:element name="node123">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:assertion test="not(matches($value, '^([-–—]|[0-9IVXLC]+\.\s)'))"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
关于xsd 断言中的正则表达式仅限于元素值的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122713/