Так что в основном у меня проблема с тем, что требуемое ограничение ключей не применяется должным образом, когда я использую ссылки на элементы. Так, например, что-то вроде этого:Ограничение ключа XML не работает с элементом, который использует ref
<xs:element ref="B" maxOccurs="unbounded"/>
отмечают, что название элементов, атрибутов, пространств имен и поэтому один лишь образцы, они в дальнейшем они будут иметь логические имена
Так есть схемы XML, который выглядит как это:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test" xmlns="test" elementFormDefault="qualified">
<xs:element name="B">
<xs:complexType>
<xs:attribute name="c" type="xs:string" use="required"/>
<xs:attribute name="d" type="xs:hexBinary" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="A" >
<xs:complexType>
<xs:sequence>
<xs:element ref="B" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="bk">
<xs:selector xpath="A/B"/>
<xs:field xpath="@c"/>
</xs:key>
</xs:element>
</xs:schema>
, который будет применяться к следующему файлу XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A xmlns="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test schema.xsd">
<B c="test0" d="0011"/>
<B c="test1" d="2233"/>
<B c="test1" d="4455"/>
</A>
Как вы видите, ограничение ключа является базовым недействительным, так как есть два Bs с тем же c (в этом случае test1). Однако, когда это подтверждено против схемы (с использованием visual studio 2012), это не признает это как ошибку.
Однако, когда я меняю схему XML на это, он работает.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test" xmlns="test" elementFormDefault="qualified">
<xs:element name="A" >
<xs:complexType>
<xs:sequence>
<xs:element name="B" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="c" type="xs:string" use="required"/>
<xs:attribute name="d" type="xs:hexBinary" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="bk">
<xs:selector xpath="A/B"/>
<xs:field xpath="@c"/>
</xs:key>
</xs:element>
</xs:schema>
Поэтому в основном элемент включен в А без ссылки, поэтому я предполагаю, что это что-то делать с атрибутом XPATH селектора ключа.
вопрос, как мне заставить это работать с ссылкой на элемент, так как я хотел бы иметь возможность использовать ссылку на элемент для более сложных структур xml.
EDIT:
Таким образом, кажется решение с TargetNamespace в правильном конце концов, я просто должен был использовать его правильно один в. Ниже в настоящее время работает и показывает, что файл XML является недействительным:
схема:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema targetNamespace="test" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="test" elementFormDefault="qualified">
<xs:element name="B">
<xs:complexType>
<xs:attribute name="c" type="xs:string" use="required"/>
<xs:attribute name="d" type="xs:hexBinary" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="A" >
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:B" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:key name="bk">
<xs:selector xpath="tns:B"/>
<xs:field xpath="@c"/>
</xs:key>
</xs:element>
</xs:schema>
файл XML также используется пространство имен, а также
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tns:A xmlns:tns="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test test.xsd">
<tns:B c="a" d="0011"/>
<tns:B c="b" d="2233"/>
<tns:B c="a" d="4455"/>
</tns:A>
Этом может быть проблемой с объемом. Вы пытались переместить определение вашего ключа в большую область действия, например. как первый дочерний тег вашего тега ''? –
хорошо его уже в теге A, который является единственным элементом в XML-файле. Поэтому я больше не могу подняться, с точки зрения объема. – DokutoMekki
Возможно, это поможет: http://msdn.microsoft.com/en-us/library/ms256101%28v=vs.110%29.aspx. В этом примере также есть пространство имен задач, и выражения XPath явно используют это пространство имен, которое сделает ваш тест XPath: A/test: B'. –