vacio puede partir etiquetas estar esquema elemento ejemplo crear con basicas atributos acuerdo xml xml-parsing xsd xsd-validation xsd-1.1

puede - etiquetas basicas de xml



Validación XML(diferentes etiquetas secundarias) según el valor del atributo (2)

Una solución sería validar los contenidos de acuerdo con sus espacios de nombres, si los califica en su fuente:

<dashboard> <widget type="chart"> <title text="Chart Title"></title> <plotOptions xmlns="http://jaspersoft.com/highcharts"> ... </plotOptions> </widget> </dashboard>

Si puede ajustar los elementos de la tabla HTML dentro de una <table> , será más sencillo escribir las aserciones:

<dashboard> <widget type="table"> <title text="Table Title"></title> <table xmlns="http://www.w3.org/1999/xhtml"> <thead>...</thead> <tbody>...</tbody> </table> </widget> </dashboard>

Con una xs:choice puede seleccionar una de las diferentes xs:any elemento calificado por un espacio de nombres. En <assert> puede comparar el espacio de nombres y el nombre-etiqueta del contenido con los contenidos del atributo type :

<xs:element name="widget"> <xs:complexType> <xs:sequence> <xs:element name="title">...</xs:element> <xs:choice> <xs:any namespace="http://www.w3.org/1999/xhtml" processContents="lax" maxOccurs="unbounded" minOccurs="0"/> <xs:any namespace="http://jaspersoft.com/highcharts" processContents="lax" maxOccurs="unbounded" minOccurs="0"/> </xs:choice> </xs:sequence> <xs:attribute name="type" type="xs:string"/> <xs:assert test="(@type = ''table'' and *[local-name() = ''table'' and namespace-uri() = ''http://www.w3.org/1999/xhtml'']) or (@type = ''chart'' and *[local-name() = ''plotOptions'' and namespace-uri() = ''http://jaspersoft.com/highcharts''])"/> </xs:complexType> </xs:element>

Estoy escribiendo un diseñador de tablero que creará widgets basados ​​en valores xml.

me gusta

<dashboard> <widget type="chart"> </widget> </dashboard>

Quiero cambiar las etiquetas dentro del <widget> en función del valor de @type, por ejemplo, si type = "chart" Entonces debería permitir etiquetas diferentes

<dashboard> <widget type="chart"> <title text="Chart Title"></title> <plotOptions> <plotOptions> <pie showInLegend="true" shadow="false" innerSize="50%"> <dataLabels color="#fff" distance="-20" format="{point.percentage:.0f} %" overflow="false"></dataLabels> </pie> </plotOptions> <legend width="150" align="right" x="10" layout="vertical"> <navigation></navigation> </legend> <tooltip enabled="false"></tooltip> <exporting enabled="true"></exporting> </plotOptions> </widget> </dashboard>

Y si tenemos type = "table" Debería permitir etiquetas diferentes

<dashboard> <widget type="table"> <title text="Table Title"></title> <thead> <tr> <th>One</th> <th>Two</th> <th>Three</th> </tr> </thead> <tbody> <tr> <td>DS.One</td> <td>DS.Two</td> <td>DS.Three</td> </tr> </tbody> </widget> </dashboard>

Y también debería dar una sugerencia automática en el editor XML como "ECLIPSE"


Otra solución es usar la alternativa de tipo, de XML Schema 1.1. Usando los tipos alternativos puede establecer diferentes tipos para un elemento dependiendo del valor de un atributo. En su caso, puede establecer en el elemento widget el tipo "gráfico" si el valor del @type es "gráfico", y el tipo "tabla" en caso de que el valor del @type sea "tabla". Vea a continuación un esquema de muestra:

<xs:element name="dashboard"> <xs:complexType> <xs:sequence maxOccurs="unbounded"> <xs:element name="widget" type="widgetBaseType"> <xs:alternative test="@type=''chart''" type="chart"/> <xs:alternative test="@type=''table''" type="table"/> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="widgetBaseType"> <xs:attribute name="type"/> </xs:complexType> <xs:complexType name="chart"> <xs:complexContent> <xs:extension base="widgetBaseType"> <xs:sequence> <xs:element name="title"/> <xs:element name="plotOptions"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="table"> <xs:complexContent> <xs:extension base="widgetBaseType"> <xs:sequence> <xs:element name="title"/> <xs:element name="thead"/> <xs:element name="tbody"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType>