РЕДАКТИРОВАТЬ 13/07/2020:
То, что я пытаюсь достичь, это проверить 3 элемента в XML. Элемент 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>
Я создал основной файл XSD (Main.xsd
) для пространство имен http://www.example.com/PO1
:
<?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>
И я создал другой файл Main_Sub_1.xsd
для пространства имен urn:oasis:names:specification:ubl:schema:xsd:Invoice-2
:
<?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", и он работает, но как только я использую эту c урну, выдается ошибка.
Я видел, что урна указывает на схему xsd, которую можно просмотреть здесь: https://schemas.liquid-technologies.com/oasis/ubl/2.0/?page=ubl-invoice-2_0_xsd.html
Итак, я предполагаю, что валидатор, когда вижу это пространство имен, вместо того, чтобы импортировать мой файл с типом кредита Примечание, которое я создал ed, просматривает файл на удаленном сервере, для которого не определен тип creditNote. У меня нет большого опыта работы с XML и XSD, но поскольку замена урны на что-то еще заставляет мою проверку работать, я так понял это.
Как я могу исправить эту ошибку?