2010-10-11 10 views
6

Estoy buscando una variante para elegir un atributo para un elemento, que se puede establecer directamente o hacer referencia.Elección de los atributos en la instancia XML para los atributos o referencias directamente definidos

esto es lo que tenemos en mente:

<root>  
<element> 
    <attribute ref="shortname" /> 
</element> 
<element> 
    <attribute name="shortname" isEditable="true" anotherattrib="0815" /> 
</element> 
</root> 

Dado que esto no sería un problema sin un esquema XML, la definición de este atributo es bastante difícil si se requiere atributo "nombre" del atributo del elemento.

el esquema podría tener este aspecto

<xs:element name="attribute"> 
<xs:complexType> 
<xs:attribute name="ref" use="required" /> 
<xs:attribute name="name" use="required" /> 
</xs:complexType> 
</xs:element> 

¿Hay alguna posibilidad de hacer una elección (similar a un xs: opción para los elementos) entre los atributos? Al igual que si hay un atributo del atributo del elemento denominado ref, no se permiten otros atributos. si no, se debe establecer el atributo "nombre" ...

Este problema parece puramente virtual y académico, pero me alegraría si pudiera haber una solución o si estoy completamente equivocado con lo que tengo en mente:)

¡Gracias de antemano por cualquier ayuda!

de Dave

Respuesta

1

Me parece que es imposible definir esquemas XML como usted desee. O bien, debe definir dos nombres de elementos diferentes como <attribute> y <attributeRef> con el conjunto diferente de atributos obligatorios o no debe definir ni "ref" ni "name" atributo como "required".

El esquema XML no es la única forma de verificar los datos y no se pueden definir algunos roles entre los valores de los atributos con respecto al esquema XML. Por lo tanto, si necesita verificar una relación más compleja en un documento XML, puede usar XPath y XSLT para hacerlo (consulte Schematron, XML Schema Language Comparison, Beyond W3C XML Schema, Improving XML Document Validation with Schematron, Advanced XML validation y Using XSL as a Validation Language).

+0

Creo que la única manera de expresar esto sería: declarar un tipo complejo con contenido completo, declarar dos tipos derivados con restricción, cuando se declara que el contenido principal usa una opción. –

+0

@Alejandro: En la forma en que puede declarar dos tipos. No es un problema, pero ¿cómo se puede definir una opción con dos elementos con ** el mismo nombre ** "" y otro tipo? No estoy seguro de que sea posible. Me parece que recibirá el error de que la definición del elemento "" es ambigua. – Oleg

+0

@Oleg: la elección es entre dos elementos (cada uno con un tipo derivado distinto) pero con el mismo nombre, ** en la declaración principal **, como ejemplo: complexType named 'Base'; complexType llamado 'BaseA' derivado de' Base' con restricciones; lo mismo para complexType llamado 'BaseB'; nombre del elemento 'Parent' con una opción entre un elemento llamado' Child' con el tipo 'BaseA' o un elemento llamado' Child' con el tipo 'BaseB'. –

0

Esto se puede lograr con el esquema XML 1.1 afirmaciones:

<xsd:complexType name="AttributeType"> 
    <xsd:sequence /> 
    <xsd:attribute name="ref" type="xsd:string" /> 
    <xsd:attribute name="name" type="xsd:string" /> 
    <xsd:assert test="count(@ref | @name) = 1" /> 
</xsd:complexType> 

El elemento assert asegura que sólo uno de ref y name se utilizan.

Cuestiones relacionadas