【发布时间】:2020-07-10 14:47:30
【问题描述】:
编辑 2020 年 7 月 13 日:
我想要实现的是验证 XML 中的 3 个元素。
DocumentId 元素将始终包含一个字符串,ID 元素将始终包含一个字符串,element01 将始终包含一个字符串并具有属性xsi:type="ns11:creditNote"。
元素 Document 和 DocumentList 可以具有来自任何命名空间的任何属性。
要验证的 3 个元素是:
/po:DocumentList/po:Document/po:DocumentId/po:DocumentList/po:Document/po:ID-
/po:DocumentList/po:Document/po:element01具有属性xsi:type="ns11:creditNote"
这是 XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<po:DocumentList xmlns:po="http://www.example.com/PO1"
xmlns:ns11="urn:oasis:names:specification:ubl:schema:xsd:Invoice-1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/PO1 Main.xsd" indexing="false" numPages="2" pageId="0" itemsPerPage="2" itemCount="3">
<po:Document>
<po:DocumentId>b6f066ea-1d48-566c-967a-f81a2d935d59</po:DocumentId>
<po:ID>documents/b6f066ea-1d48-566c-967a-f81a2d935d59</po:ID>
<po:element01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns11:creditNote">documents/b6f066ea-1d48-566c-967a-f81a2d935d59</po:element01>
</po:Document>
</po:DocumentList>
我为命名空间 http://www.example.com/PO1 创建了一个主 XSD 文件 (Main.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="XMLSchema-versioning" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:po="http://www.example.com/PO1" xmlns:ns11="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" targetNamespace="http://www.example.com/PO1" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:import namespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" schemaLocation="Main_Sub_1.xsd"/>
<xs:element name="DocumentList">
<xs:complexType>
<xs:sequence>
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element name="DocumentId" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="ID" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="element01" type="ns11:creditNote"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
</xs:element>
</xs:schema>
我为命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 创建了另一个文件Main_Sub_1.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" attributeFormDefault="qualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns11="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<xs:simpleType name="creditNote">
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:schema>
但是,当我尝试验证主 XSD 文件时,我收到此错误:
"'ns11:creditNote' 必须引用现有的简单或复杂类型。"
我做了一些实验,并尝试将命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 更改为“test01”并且它可以工作,但是一旦我使用这个特定的骨灰盒,它就会抛出一个错误。
我看到 urn 指向可以在此处查看的 xsd 架构: https://schemas.liquid-technologies.com/oasis/ubl/2.0/?page=ubl-invoice-2_0_xsd.html
所以我猜测验证器,当看到这个命名空间时,不是导入我创建的类型 creditNote 的文件,而是查看远程服务器中没有定义类型 creditNote 的文件。我没有太多使用 XML 和 XSD 的经验,但是因为用其他任何东西替换 urn 可以使我的验证工作,所以我就是这么理解的。
我该如何解决这个错误?
【问题讨论】:
-
两种可能性:1. 从 XML 中删除
xsi:type="ns11:creditNote"或 2. 在某处定义类型ns11:creditNote。 -
@zx485 :如何定义类型 ns11:creditnote ?我尝试创建另一个 xsd 并导入它,但我没有设法让它工作。
-
也尝试了一些东西。但也无法提供解决方案。对不起。
标签: xml xsd xsd-validation xml-validation