我想通过架构验证以下XML,如果l10n
元素中没有文本,则不应验证它。此外,元素对于XML也是必需的。请有人建议我相关的答案。
要验证的XML将是:
<body xmlns="http://iddn.icis.com/ns/test">
<content>
<l10n xml:lang="en"></l10n>
</content>
</body>
我目前使用的架构如下,但它仍然允许验证上述XML。
<xs:schema elementFormDefault="qualified" targetNamespace="http://iddn.icis.com/ns/test"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:conf="http://iddn.icis.com/ns/config"
xmlns="http://www.w3.org/1999/xhtml">
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">
</xs:import>
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="content">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="i18n-value">
<xs:sequence>
<xs:element name="l10n" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="nameType">
<xs:attribute ref="xml:lang" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="body">
<xs:complexType>
<xs:sequence><xs:element ref="content"></xs:element></xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:1)
这里有很多问题。让我们分两个阶段集体解决它们:首先,我们将修复阻止进行任何类型验证的XSD问题。
此XML
<?xml version="1.0" encoding="utf-16"?>
<body xmlns="http://iddn.icis.com/ns/test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://iddn.icis.com/ns/test try.xsd">
<content>
<l10n xml:lang="en"></l10n>
</content>
</body>
对此XSD有效:
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://iddn.icis.com/ns/test"
xmlns:tst="http://iddn.icis.com/ns/test">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="content">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="i18n-value">
<xs:sequence>
<xs:element name="l10n" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tst:nameType">
<xs:attribute ref="xml:lang" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="body">
<xs:complexType>
<xs:sequence>
<xs:element ref="tst:content"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
现在,l10n
不为空的约束仍有待解决。以下是如何执行此操作:
将xsd:any/@processContents
从skip
更改为lax
以便您
可以通过元素声明影响xsd:any
下的验证。点击此处了解有关差异的更多信息:processContents strict vs lax vs skip for xsd:any:
实际为xs:element
定义i18n-value
;有类型
单凭定义是不够的。
将i18n-value
添加到您的XML。
...共
<强> XML 强>
<?xml version="1.0" encoding="utf-16"?>
<body xmlns="http://iddn.icis.com/ns/test"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://iddn.icis.com/ns/test try.xsd">
<content>
<i18n-value>
<l10n xml:lang="en"></l10n>
</i18n-value>
</content>
</body>
<强> XSD 强>
<xs:schema elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://iddn.icis.com/ns/test"
xmlns:tst="http://iddn.icis.com/ns/test">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="content">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="i18n-value">
<xs:complexType>
<xs:sequence>
<xs:element name="l10n" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="tst:nameType">
<xs:attribute ref="xml:lang" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="body">
<xs:complexType>
<xs:sequence>
<xs:element ref="tst:content"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>