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

标签 regex xml xsd xsd-1.1

我在 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 与其他表达式一起使用时,它不适用于整个元素值。

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

最佳答案

注意事项:

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

  2. 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/

相关文章:

c# - XML 文件是否始终具有相同的结构?

python - 在正则表达式 python 中更改行

php - 关于回溯控制动词的信息

c# - 使用 C# 在 Windows CE 中加载 XML 文档

java - 无法解析符号 AppCompat

c# - 如何解析 xs :annotation from the xs:choice using the System. Xml.Schema

java - wsimport 两个声明导致冲突

regex - VBScript 正则表达式 - 条件匹配

regex - grep 文件内完整的资源 url

c++ - tinyxml。获取节点的全文(或 "raw content")?