xsd 断言中的正则表达式仅限于元素值的开头

Regex in xsd assertion limited to beginning of element value

我在 xsd 模式 1.1 中创建了包含正则表达式的断言。这些表达式应该从元素值的开头排除罗马数字和在它们之后有句点和 space 的数字。根据我的阅读,我不需要将正则表达式锚定在 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 与其他表达式一起使用时,它不适用于整个元素值。

有没有办法将表达式限制为仅第一个单词或元素的开头?

我会发表评论,但还没有声誉点数可以发表评论。但是你可以强制你的正则表达式开始而不是这样做:

'[\d] ...

这样做:

'^\s*[\d] ..

“^”强制开始,“\s*”处理任何流氓白space。

备注:

  1. XSD xsd:pattern 方面中的正则表达式 在开始时隐式锚定 ( ^) 和结束 ($).

  2. xsd:assertion 中使用的 XPath 正则表达式 不是 隐式锚定。

鉴于上述情况,正则表达式 (以及他尝试添加 ^ 的建议)是您排除看起来像阿拉伯数字或罗曼数字的字符串的目标的合理近似值:

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