2010-11-08 18 views
9

Creo que esto tiene que ver con keyref pero no estoy seguro, y realmente no estoy seguro de que se pueda hacer en absoluto.Restricción de elementos XML basados ​​en otro elemento a través de XSD

Por ejemplo, supongamos que tengo myElement1 y myElement2. Si no hay myElement2 en el archivo XML, entonces myElement1 debe existir; de lo contrario, es opcional.

¿Hay alguna manera de forzar este tipo de validación en mi archivo XSD?

+1

Estoy bastante seguro de que la respuesta no es debido a la ambigüedad: el esquema para el contenedor de dichos elementos tendría dos definiciones diferentes. La única solución es declarar el elemento "opcional/requerido" como opcional y usar una segunda fase de validación. –

Respuesta

23

preguntas similares se han preguntado varias veces .. en stackoverflow o cualquier blogs de tecnología ..

pero la respuesta es siempre no es posible,


casos como:

(una) Elemento de validación según el valor o la presencia de cualquier otro elemento/atributo
(b) Validación del valor de un elemento según el valor o presencia de cualquier otro elemento/atributo
(c) la validación de atributo en función del valor o la presencia de cualquier otro elemento/atributo
(d) que define elementos/atributos del mismo nombre que tiene diferentes tipos/DataTypes bajo mismo alcance
(e) validación de elementos secundarios sobre la base del valor o la presencia de cualesquiera otros elementos/atributos

todos los casos mencionados anteriormente no son posibles de alcanzar ..

pero si se puede poner en práctica algo transformación .. entonces se puede obtener ayuda. Lo que quiero decir es "primero pasar por transformación y modificar el XML según su requisito,

ejemplo :: si el campo particular se espera con algún valor ... pase el XML como está si se cumple la condición y no pase si no lo hace .. en el siguiente bloque XSD va a validar y obviamente se equivoca :) puede descubrir que le falta su validación personalizada ...

de todos modos la intención es bloque o pase el xml según los datos ... y eso es lo que está haciendo ...

Nota: ¡Schematron ha sido una buena práctica recientemente! Aquí está el tutorial: http://zvon.org/xxl/SchematronTutorial/General/contents.html

+0

¡Gracias por la información! Busqué antes de publicar pero no pude encontrar una respuesta. Básicamente, descubrí que es imposible hacer solo con validación y esquema. – hmcclungiii

+0

@hmcclungiii, así es el punto :) –

+1

Esta es una paráfrasis bastante razonable pero no completamente precisa de la situación en XSD 1.0: los casos (a), (b), (e) y (f) a veces son posibles, dependiendo de los detalles de la restricción deseada. Y en XSD 1.1, las características de tipo condicional y aserción hacen que se pueda expresar una gama de restricciones algo más amplia. –

1

Lo que sugeriría es crear XSD para cada uno de los casos se definen a continuación:

casos como:

  1. Validando elemento en función del valor o la presencia de cualquier otro elemento/atributo.
  2. Valor de validación de un elemento según el valor o la presencia de cualquier otro elemento/atributo.
  3. Atributo de validación según el valor o la presencia de cualquier otro elemento/atributo.
  4. Ignorar (aleatorio) los elementos/atributos de la validación no está permitido. (Quiero decir es el uso de tiene restricciones.)
  5. Elementos/atributos del mismo nombre que tienen diferentes tipos de datos.
  6. Validar elementos secundarios en función del valor o la presencia de cualquier otro elemento/atributo.

Y cree su propio XML para eso.

Cuestiones relacionadas