XSD:将element的属性值约束为父属性的子字符串

时间:2014-04-07 16:10:12

标签: java xml eclipse xsd

考虑这段XML

<Parent id="MyParent1">
   <Child id="MyParent1.MyChild1"/>
</Parent>

<Parent id="MyParent2">
   <Child id="MyParent2.MyChild1"/>
   <Child id="MySillyIncorrectPrefix.MyChild2"/>
</Parent>

如何验证(可能使用XSD)其id包含父元素id作为前缀的子元素,以便:

<Child id="MyParent2.MyChild1"/> <!-- is valid -->
<Child id="MySillyIncorrectPrefix.MyChild2"/> <!-- is not valid -->

我没有绑定XSD版本1.0,所以我可以尝试使用XSD 1.1(和断言等功能),但我想知道:

  • 如何用xs:断言或更合适的XSD 1.1来表达上述约束 特征。
  • 如果可以利用Java在Java中构建验证器 那个xsd? &#34;的Xerces-J&#34;是一个可行的解决方案吗?

由于我对XSD 1.1的了解有限,我想出了这个尝试:

<xs:element name="Child"> 
  <xs:complexType>
     <xs:attribute name="type" type="xs:String" />
     <xs:assert test="starts-with(@type,../@type)"/>
</xs:complexType> 
</xs:element>

这是对的吗?有没有可以测试它的工具? 更一般:是否有工具来帮助构建和测试这种XSD 1.1特色模式? (afaik Eclipse仅支持XSD 1.0)

2 个答案:

答案 0 :(得分:2)

您所描述的内容在XSD 1.0中不可行。

在XSD 1.1中,您可以对父类型使用断言,要求每个子ID的id属性以父ID的id属性的值开头。

答案 1 :(得分:0)

此架构应验证该示例(使用xsd 1.1断言)

<?xml version="1.1" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/stackoverflow" xmlns:tns="http://www.example.org/stackoverflow" elementFormDefault="qualified">

    <complexType name="ParentType">
        <sequence>
            <element name="Child" type="tns:ChildType"
                maxOccurs="unbounded" minOccurs="0">
            </element>
        </sequence>
        <attribute name="id" type="string"></attribute> 
    </complexType>

    <element name="Parent" type="tns:ParentType"></element>

    <complexType name="ChildType">
        <attribute name="id" type="string"></attribute>
        <assert test="starts-with(@id,../@id)"/>
    </complexType>

</schema>