编辑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
- 属性为
xsi:type="ns11:creditNote"
的/po:DocumentList/po:Document/po:element01
这是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,它就会抛出一个错误。
我看到urn指向一个xsd模式,可以在这里查看:https://schemas.liquid-technologies.com/oasis/ubl/2.0/?page=ubl-invoice-2_0_xsd.html
因此,我猜验证器在看到这个名称空间时,并没有使用我创建的creditNote类型导入我的文件,而是查看远程服务器中没有定义creditNote类型的文件。我在XML和XSD方面没有太多经验,但由于用其他任何东西替换urn可以使我的验证工作正常,所以我就是这样理解它的
如何修复此错误?
我想验证XML中的两个特定元素,并允许添加任何其他属性和元素。
您需要非常具体地了解这些附加标记/属性需要出现在哪里。最好的方法是编辑你的问题,并添加一些显示额外内容的示例消息。
当我尝试验证XML时,我有一个错误:";属性"xsi:type"不允许使用值"ns11:creditNote">
您正在断言标记"po:DocumentList"与命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2
中名称为creditNote
的类型定义匹配。但您尚未定义该类型。事实上,您甚至还没有导入具有该targetNamespace的XSD。
你真的试图覆盖po:DocumentList的类型吗?或者你是想把"creditNote"类型用于其他目的?
总之,您的问题表明在如何定义和使用XMLSchema扩展机制方面存在一定的困惑。如果你能稍微澄清一下问题,我很乐意帮忙。