面对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的验证。
答案 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>