如何基于Attribute值进行XML验证

时间:2018-04-02 13:11:00

标签: xml schema xml-dtd schematron

面对XML验证的问题。我的XML数据看起来像这样

<Sections>
          <Section Id="DateAndTimeSection" Enable="True" >
            <Column Id="Date" Format="YYYYMMDD" />
            <Column Id="Time" Format="HHMMSS" />
          </Section>
          <Section Id="ComponentIdSection" Enable="True" >
            <Column Id="ComponentId" Title="COUNTER" Enable="True" />
          </Section>
    </Sections>

我需要根据“ Section ”元素的“ Id ”属性来验证XML文档。

如果部分 ID 值为 DateAndTimeSection ,那么它应仅支持列的ID 日期时间。如果存在除上述之外的任何,即。除日期时间以外的 Id 值时,应将其作为无效的XML通知。

示例:有效的XML

<Section Id="DateAndTimeSection" Enable="True" >
        <Column Id="Date" Format="YYYYMMDD" />
        <Column Id="Time" Format="HHMMSS" />
</Section>

无效的XML

<Section Id="DateAndTimeSection" Enable="True" >
         <Column Id="Date" Format="YYYYMMDD" />
         <Column Id="Example" Format="YYYY" />
</Section>

我尝试使用基于XML Schema和Schematron的验证。

2 个答案:

答案 0 :(得分:0)

您可以使用&#34;条件类型分配&#34;来实现此目的。 (也称为&#34;类型替代品&#34;)XSD 1.1中的功能。它不能用XML Schema 1.0完成。

类型替代方案允许模式表示元素的类型取决于元素属性的值。

XSD 1.1在Altova,Saxon和Xerces中实现,但不是在Microsoft的XSD处理器中实现。

答案 1 :(得分:0)

XSD(仅限于有趣的部分和草稿):

<xs:element name="Sections">
    <xs:complexType>
        <xs:sequence>
            <!-- other content?-->
            <xs:element ref="Section" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="Section">
    <xs:complexType>

        <xs:sequence>
            <!-- other content?-->
            <xs:element ref="Column" maxOccurs="unbounded"/>
        </xs:sequence>

        <xs:attribute name="Id" use="required" type="xs:string"/>
        <!--         other attribute definitions   -->
    </xs:complexType>
</xs:element>

<xs:element name="Column">
    <xs:complexType>
        <!-- other content or empty?-->
        <xs:attribute name="Id" use="required" type="xs:string"/>
        <!--         other attribute definitions   -->
    </xs:complexType>
</xs:element>

的Schematron:

<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2" xmlns:sqf="http://www.schematron-quickfix.com/validator/process">
    <sch:pattern>
        <!-- check only Columns in DateAndTimeSections-->
        <sch:rule context="Section[@Id = 'DateAndTimeSection']/Column">
            <!-- Check that ID is Date or Time -->
            <sch:assert test="@Id = 'Date' or @Id = 'Time'">Columns in DateAndTimeSections should have the ID Date or Time.</sch:assert>
        </sch:rule>
    </sch:pattern>
</sch:schema>