2015-05-20 2 views
1

Я много раз пробовал Google, но это либо невозможно, либо терминология, которую я использую, неверна. Можно ли сделать XSD для следующего примера:XSD Где значение элемента - это имя другого элемента

<inputs> 
    <input> 
     <name>Test 1</name> 
     <valuesTag>values_generated_15Jan2015</valuesTag> 
    </input> 
<inputs> 
<values> 
    <values_generated_15Jan2015> 
     ... 
    </values_generated_15Jan2015> 
</values> 

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

+0

Возможно, вы можете сделать это с помощью XSD 1.1. Если я хорошо понимаю, для каждого * * узла, он должен появиться внутри * *, узел с именем, равным значению * *. Какой контент вам нужен внутри (например) * *? – sergioFC

+0

Это правильно. Значения представляют собой список комплексных чисел, который может составлять от 50 до 1000 записей. – steveo225

+0

В порядке ли вы использовать что-то вроде * <значение id = "values_generated_15Jan2015"> *? – sergioFC

ответ

1

Взгляните на этот пример, используя утверждения XSD 1.1, которые поясняются в комментариях.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 

    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="inputs" type="inputsType" /> 
       <xs:element name="values" type="valuesType" /> 
      </xs:sequence> 
      <!-- Ensures that there is the same number of value nodes than input nodes --> 
      <xs:assert test="count(values/value) = count(inputs/input)" /> 
      <!-- Ensures that every value in a valueId node is unique --> 
      <xs:assert test="count(inputs/input/valueId) = count(distinct-values(inputs/input/valueId))" /> 
      <!-- Ensures that every value in a id attribute is unique --> 
      <xs:assert test="count(values/value) = count(distinct-values(values/value/@id))" /> 
      <!-- Ensures that all values in id attributes appear in valueId --> 
      <xs:assert test="count(values/value[@id = ../../inputs/input/valueId]) = count(values/value)" /> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="inputsType"> 
     <xs:sequence> 
      <xs:element name="input" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="name" type="xs:string" /> 
         <xs:element name="valueId" type="xs:string" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="valuesType"> 
     <xs:sequence> 
      <xs:element name="value" maxOccurs="unbounded"> 
       <xs:complexType> 
        <!-- Content --> 
        <xs:attribute name="id" type="xs:string" use="required" /> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 
+1

Это действительно сработало, хотя мне пришлось написать собственный 'getElementById()' Xerces не играл красиво – steveo225

+0

Я рад, что это сработало. Я не знаком с Xerces – sergioFC

Смежные вопросы