使用一个架构文件处理两个 XML 个文件
Handle two XML files with one schema file
我有一个关于 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 文件有效使用倒置标签将无法验证。
我该如何处理这两种不同的安排?
正如 Martin 所提到的,这是一个 XML 架构问题,而不是 XSLT。
您需要 xs:all
元素,例如:
<xs:all>
<xs:element ref="tempData" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="DataSet" minOccurs="0" maxOccurs="unbounded" />
</xs:all>
您真的希望两个元素都是可选的吗?
下面的解决方案将允许 'DataSet' 和 'tempData' 都出现在 'Data' 元素中,两者可以同时(以任何顺序),一个或另一个单独,或两者都不是(空 '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将有效
我有一个关于 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 文件有效使用倒置标签将无法验证。
我该如何处理这两种不同的安排?
正如 Martin 所提到的,这是一个 XML 架构问题,而不是 XSLT。
您需要 xs:all
元素,例如:
<xs:all>
<xs:element ref="tempData" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="DataSet" minOccurs="0" maxOccurs="unbounded" />
</xs:all>
您真的希望两个元素都是可选的吗?
下面的解决方案将允许 'DataSet' 和 'tempData' 都出现在 'Data' 元素中,两者可以同时(以任何顺序),一个或另一个单独,或两者都不是(空 '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将有效