Saltar al contenido principal

Elección entre varias opciones

Podemos definir elementos opcionales mediante el operador de elección (|). En lugar de separar los nombres de los elementos por comas, los separamos mediante el operador de elección.

<!ELEMENT country(name | code)>

La regla anterior permite validar un elemento <country>. Este elemento debe contener un elemento <name> o un elemento <code>, pero no ambos a la vez.

Los siguientes XML serían válidos:

<country>
<name>Spain</name>
</country>
<country>
<code>es</code>
</country>

Sin embargo, el siguiente código XML no sería válido:

<country>
<name>Spain</name>
<code>es</code>
</country>

Se pueden indicar tantas opciones como sean necesarias. Todas ellas deben ir separadas por |.

<!ELEMENT country(name | code | id)>

En este caso, en lugar de tener que realizar una elección entre dos opciones, será una elección entre tres opciones.

Opciones de tipos diferentes

Entre las opciones para elegir, se pueden mezclar tipos. Por ejemplo:

<!ELEMENT libro (#PCDATA | isbn | id)>

En la regla anterior, se puede elegir:

  • Texto.
  • Un elemento <codigo>.
  • Un elemento <id>.
#PCDATA como opción

Cuando se utiliza el operador de elección (|), si una de las opciones es #PCDATA, esta debe escribirse en primer lugar. En otro caso, se producirá un error.

Lo siguiente es incorrecto:

<!ELEMENT libro (isbn | #PCDATA | id)>

Los siguientes XML serían válidos:

<libro>Fuego y sangre. Canción de hielo y fuego.</libro>
<libro>
<isbn>9788466367844</isbn>
</libro>
<libro>
<id>13101138</id>
</libro>

Sin embargo, el siguiente código XML no sería válido:

<libro>
Fuego y sangre. Canción de hielo y fuego.
<isbn>9788466367844</isbn>
</libro>

Elección en una secuencia de elementos

Lo más habitual es que la elección entre varios elementos se produzca en una secuencia. Para ello, en primer lugar, indicaremos la lista de elementos de forma ordenada.

<!ELEMENT persona(id, nombre, apellidos)>

A continuación, substituimos el nombre del elemento que tiene múltiples opciones. Por ejemplo, un identificador de una persona podría ser un DNI, un NIF, un NIE o un pasaporte. Todas esas opciones irán dentro de paréntesis separados por el operador de elección.

<!ELEMENT persona((dni | nif | nie | pasaporte), nombre, apellidos)>

Los siguientes código XML serían válidos:

<persona>
<dni>59771400C</dni>
<nombre>Manuel</nombre>
<apellidos>Martínez González</apellidos>
</persona>
<persona>
<nif>93694934A</nif>
<nombre>Manuel</nombre>
<apellidos>Martínez González</apellidos>
</persona>
<persona>
<nie>05089389E</nie>
<nombre>Manuel</nombre>
<apellidos>Martínez González</apellidos>
</persona>
<persona>
<pasaporte>98909853470</pasaporte>
<nombre>Manuel</nombre>
<apellidos>Martínez González</apellidos>
</persona>

Sin embargo, el siguiente código XML no sería válido:

<persona>
<dni>59771400C</dni>
<pasaporte>98909853470</pasaporte>
<nombre>Manuel</nombre>
<apellidos>Martínez González</apellidos>
</persona>

Elección entre secuencias de elementos

También es posible elegir entre varias secuencias de elementos:

<!ELEMENT municipio ((provincia, nombre) | cp)>

En la regla anterior, se puede elegir entre dos opciones:

  • Los elementos <provincia> y <nombre>.
  • El elemento <cp>.

Los siguientes código XML serían válidos:

<municipios>
<provincia>Pontevedra</provincia>
<nombre>Lalín</nombre>
</municipios>
<municipios>
<cp>15910</cp>
</municipios>