Pregunta

Tengo un documento XML con (básicamente) se ve así:

...
<param>
    <key>age</key>
    <value>10</value>
</param>
<param>
    <key>smart</key>
    <value>true</value>
</param>
...

Me gustaría restringir los valores disponibles en función de la clave del parámetro, por ejemplo, la edad debería ser un entero en [0, 150] y Smart debe ser verdadero o falso.

Ahora, si el XML fuera diferente (por ejemplo, como en el ejemplo a continuación), sería muy simple:

...
<age>10</age>
<smart>true</smart>
...

Sin embargo, la estructura XML no cambiará en este punto y no estoy seguro de que lo haga. ¿Hay alguna manera de implementar este tipo de restricciones con la estructura XML actual y, de ser así, cómo?

ACTUALIZAR:

A juzgar por la (ausencia completa de) retroalimentación, diría que es probable que esto no sea posible usando XSD. ¿Alguien puede confirmar?

¿Fue útil?

Solución

Parece que prácticamente necesitarías una definición que se vea como esto:

  <!-- This is an INVALID example -->
  <xs:element name="param">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="age" />
          <xs:element name="value" type="xs:decimal" />
        </xs:sequence>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="smart" />
          <xs:element name="value" type="xs:boolean" />
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

Desafortunadamente, tal código de código da como resultado esquema XML no válido expediente.

Aunque la sintaxis es correcta, la semántica viola las reglas del esquema. Los elementos con el mismo nombre y en el mismo alcance deben tener el mismo tipo. En este caso, significa especialmente que todos los <value> elementos que son hijos de <param> Los elementos deben tener el mismo tipo.

Formalmente esto es Restricción del componente del esquema: declaraciones de elementos consistentes. Consulte también la siguiente restricción del componente del esquema; En general, no puede hacer que un tipo de elemento dependa de otros valores en el documento o de ninguna información sobre los elementos en el resto de la secuencia.

Actualizar

Olvidé esto totalmente, pero deberías poder obtener las restricciones que deseas si especifica el tipo deseado En el documento de instancia en lugar de definirlo puramente en el esquema. Esto se puede hacer agregando el xsi:type atribuir a <value> elementos.

Ejemplo

<param>
    <key>age</key>
    <value xsi:type="xs:decimal">10</value>
</param>
<param>
    <key>smart</key>
    <value xsi:type="xs:boolean">true</value>
</param>

Por supuesto, esto es un poco inconveniente, ya que requiere cambiar el proceso de generación XML. Además, no proporciona automáticamente ninguna garantía de que <key> y el definido xsi:type son un par coincidente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top