【问题标题】:Value is not allowed for attribute xsi:type属性 xsi:type 不允许使用值
【发布时间】: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


【解决方案1】:

我想验证我的 XML 中的 2 个特定元素并允许添加任何其他属性和元素。

您需要非常具体地说明这些额外的标签/属性需要出现在何处。最好的方法是编辑您的问题并添加一些显示额外内容的示例消息。

当我尝试验证 XML 时出现错误:“属性 'xsi:type' 不允许使用值 'ns11:creditNote'。”

您断言标签“po:DocumentList”与命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 中名称为creditNote 的类型定义匹配。但是您尚未定义该类型。事实上,您甚至还没有导入具有该 targetNamespace 的 XSD。

你真的想覆盖 po:DocumentList 的类型吗?或者您是否出于其他目的尝试使用“creditNote”类型?

总之,您的问题暗示了关于如何定义和使用 XML Schema 扩展机制的一些混淆。如果您能稍微澄清一下问题,我们很乐意提供帮助。

【讨论】:

  • 我编辑了我的问题。我做了一些改变并试图修复它,但我仍然失败了。我创建了另一个文件来定义命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 中的creditNote 类型。你能检查我的编辑,看看它是否澄清了我的问题吗?
  • 感谢您的更新。不过,我仍然不清楚您要达到的目标。既然已经声明了 element01 的类型,为什么还要使用 xsi:type?你真的想在所有 3 个标签上都允许可选属性吗?如果是这样,您是否要允许字面意义上的 any 属性,或者来自导入的 xsds only 或 ... 的属性?很抱歉问,但您需要解释这些事情,否则不要提及“无论其属性如何”之类的要求。
  • 我想要实现的是验证 XML 中的 3 个元素。不知道为什么xml文件中使用了xsi:type,这是我收到的文件,无法修改。
  • DocumentId 元素将始终包含一个字符串,ID 元素将始终包含一个字符串,element01 将始终包含一个字符串并具有属性 xsi:type="ns11:creditNote"。元素 Document 和 DocumentList 可以具有来自任何命名空间的任何属性。我将删除不必要的要求。
  • 如果您不知道为什么要使用 xsi:type,那么您非常不太可能创建正确的 XSD。在寻找解决方案之前,您需要了解问题。至少您应该询问提供此 XSD 的团队允许的变化是什么。答案可能会让您大吃一惊。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2011-05-06
  • 2011-03-30
  • 2020-10-01
相关资源
最近更新 更多