2016-02-19 30 views
2

我看起来有一个相当不寻常的问题。我有一个xml,大致看起来像他的:XSD验证第n个孩子的父代中的唯一ID属性

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="tbd"> 
    <A> 
     <B id="01"> 
      <C id="02" /> 
      <C id="03" /> 
     </B> 
     <B id="04"> 
      <C id="05" /> 
     </B> 
    </A> 
    <A> 
     <B id="01"> 
      <C id="02" /> 
      <C id="03" /> 
     </B> 
     <B id="04"> 
      <C id="05" /> 
     </B> 
    </A> 
</root> 

正如你所看到的,块A可以重复n次。我的问题是验证id属性对A(child,grandchild,asf。)的所有后代是唯一的。到目前为止,我设法验证B的ID是里面唯一的,而C的编号为B与上午XSD的独特的内部看起来是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="tbd" xmlns:tbd="tbd" elementFormDefault="qualified"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="A" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="B" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="C" maxOccurs="unbounded"> 
              <xs:ComplexType> 
               <xs:attribute name="id" type="xs:int" use="required" /> 
              </xs:complexType> 
             </xs:element> 
            </xs:sequence> 
           </xs:complexType> 
           <xs:attribute name="id" type="xs:int" use="required" /> 

           <xs:unique name="UniqueC"> 
            <xs:selector xpath="tbd:C" /> 
            <xs:field xpath="@id" /> 
           </xs:unique> 

          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 

        <xs:unique name="UniqueB"> 
         <xs:selector xpath="tbd:B" /> 
         <xs:field xpath="@id" /> 
        </xs:unique> 

       </xs:element> 
      </xs:sequence> 
     </xs:compleyType> 
    </xs:element> 
</xs:schema> 

我在找什么像类型的确认=“XS:ID”,而不是整个文档,但只有内部的A,使得下面的例子将是无效的(现在这将是有效的):

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="tbd"> 
    <A> 
     <B id="01"> 
      <C id="01" /> <!-- should be invalid --> 
      <C id="02" /> 
      <C id="04" /> 
     </B> 
     <B id="04"> <!-- should be invalid --> 
      <C id="02" /> <!-- should be invalid --> 
      <C id="05" /> 
     </B> 
    </A> 
    <A> 
     <B id="01"> 
      <C id="012" /> 
      <C id="02" /> 
      <C id="04" /> 
     </B> 
     <B id="042"> 
      <C id="05" /> 
     </B> 
    </A> 
</root> 

回答

1

xs:selector用于选择字段值应该唯一的节点列表。因此,如果您希望ID在每个B和每个C都是唯一的,那么您需要选择选择器中的所有节点。示例(请注意,在XPath中,|字符表示节点的联合):

<xs:selector xpath="tbd:B | tbd:B/tbd:C" /> 
+0

非常感谢! 我在现场节点中做了这件事,并没有奏效。这正是我所期待的:D – PowderFan

+0

不客气:) – sergioFC

+1

它甚至可以与 一起使用,我也只在字段节点中使用它。 .. 但现在我实际上得到了选择器和字段节点* facepalm * ^^之间的关系 – PowderFan