2013-12-02 1 views
1

Так что в основном у меня проблема с тем, что требуемое ограничение ключей не применяется должным образом, когда я использую ссылки на элементы. Так, например, что-то вроде этого:Ограничение ключа 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> 
+0

Этом может быть проблемой с объемом. Вы пытались переместить определение вашего ключа в большую область действия, например. как первый дочерний тег вашего тега ''? –

+0

хорошо его уже в теге A, который является единственным элементом в XML-файле. Поэтому я больше не могу подняться, с точки зрения объема. – DokutoMekki

+0

Возможно, это поможет: http://msdn.microsoft.com/en-us/library/ms256101%28v=vs.110%29.aspx. В этом примере также есть пространство имен задач, и выражения XPath явно используют это пространство имен, которое сделает ваш тест XPath: A/test: B'. –

ответ

1

При указании XPath элементов ключей и ссылки на пространство имен целевого XML должны быть включены. Использование пространства имен tns вашего примера схему, выражение XPath ключа определения должны быть изменены на

<xs:selector xpath="tns:A/tns:B"/> 

Аналогично, выражение XPath эталонного определения должны быть изменены на

<xs:element ref="tns:B" maxOccurs="unbounded"/>