【问题标题】:XSD attribute-value based regex-validation in XSD 1.1 assertXSD 1.1 断言中基于 XSD 属性值的正则表达式验证
【发布时间】:2017-08-28 10:06:05
【问题描述】:

我有和 XML sn-p 这样的。我需要进行 XSD 验证,例如:如果字段属性“名称”是端口,那么它必须匹配正则表达式以确定它是否是数字(如 '\p{Nd}+')

<Data>
    <Attributes>
        <Field name="nodeType">abcd</Field>
        <Field name="port">5462</Field>
    </Attributes>
</Data>

在我的 XSD 中,我使用如下所示的断言

<xs:element name="Field" maxOccurs="unbounded" minOccurs="0">
                                <xs:complexType>
                                  <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                      <xs:attribute type="xs:string" name="name" use="optional"/>
                                      <xs:assert test="if(@name='port') then matches($value,'\p{Nd}+') else false())"/>
                                    </xs:extension>
                                  </xs:simpleContent>
                                </xs:complexType>
                              </xs:element>

但是,当我运行时,我会抛出以下异常

xml is NOT valid reason:org.xml.sax.SAXParseException;cvc-xpath.3.13.4.2a: XPST0003 - Assertion XPath expression ('if(@name='port') then matches($value,'\p{Nd}+') else false())') on the schema type '#AnonType_FieldAttributesDataContainerRtms' couldn't compile successfully

【问题讨论】:

    标签: java xml xsd xsd-validation xsd-1.1


    【解决方案1】:

    你有一个杂散的右括号:

    false())
           ^
    

    用于比较的撒克逊错误信息:

    Error at xs:assert on line 7 column 102 of test.xsd:
      Unexpected token ")" beyond end of expression
    

    【讨论】:

    • 是的,这是个问题。但是即使在使语法正确之后,上述用例也没有发生正则表达式匹配,xml 不是有效原因:org.xml.sax.SAXParseException; systemId:文件:/C:/RTMS_Code/trunk/RestClient/conf/xml/NetConf_Node_XML_Template.xml;行号:5;列号:47; cvc-assertion:断言评估 ('if(@name='port') then matches($value,'\p{Nd}+') else false()') 用于模式类型“#AnonType_FieldAttributesDataContainerRtms”上的元素“Field”没有成功
    • 如果@name 不等于 "port" 则断言将失败。