我对XSD问题提出了一个简短的问题。 我创建了一个test.xsd文件,应该如何处理2种XML类型。 一个用于我的数据库,一个用于第三方应用程序。
无论我使用数据库XML文件,它都很有效,但在第三方软件中,XML标签位于另一个位置。让我解释一下:
数据库XML摘要:
<tempData> 123456 </tempData>
<DataSet> 505 </DataSet>
第三方软件xml摘要:
<DataSet> 505 </DataSet>
<tempData> 123456 </tempData>
XSD摘要:
<xs:complexType>
<xs:sequence>
<xs:element name="Data" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element ref="tempData" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="DataSet" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="tempData" />
<xs:element ref="DataSet" />
</xs:choice>
</xs:complexType>
</xs:element>
当我想用我的XSD文件验证这两个不同的XML文件用于数据库XML文件时它是有效的,对于带有倒置标记的第三方XML文件,它将不会验证。
我如何处理这两种不同的安排?
答案 0 :(得分:1)
正如Martin所说,这是一个XML Schema问题,而不是XSLT。
你需要xs:all
元素,所以像:
<xs:all>
<xs:element ref="tempData" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="DataSet" minOccurs="0" maxOccurs="unbounded" />
</xs:all>
你真的希望这两个元素都是可选的吗?
答案 1 :(得分:1)
下面是一个解决方案,它允许'DataSet'和'tempData'同时存在于'Data'元素中(以任何顺序),单独一个或另一个,或者两者都不存在(空'数据'元素)。
如果您希望强制任何一个出现,请将minOccurs更改为“1”。 使用'xs:all'时,'Data'元素中的每个元素不能超过一个 - 最小0或1。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Data">
<xs:complexType>
<xs:all>
<xs:element name="tempData" minOccurs="0" />
<xs:element name="DataSet" minOccurs="0" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
尝试使用:
<Data>
<DataSet> 505 </DataSet>
<tempData> 123456 </tempData>
</Data>
<Data>
<tempData> 123456 </tempData>
<DataSet> 505 </DataSet>
</Data>
<Data>
<DataSet> 505 </DataSet>
</Data>
<Data>
<tempData> 123456 </tempData>
</Data>
<Data>
</Data>
您的XML将有效