Pregunta

Estoy creando regularmente un esquema XSD transformando un modelo de datos propietario de un sistema heredado. Esto funciona bastante bien. Sin embargo, el sistema heredado solo me permite especificar atributos muy básicos de un parámetro, como el tipo de datos (int, string etc.).

Me gustaría mejorar la transformación XSL con un mecanismo que me permite agregar metadatos para proporcionar más detalles para la transformación. Pensé en algo como la notación de propiedades de Java para asignar atributos a un XPath.

Imagine el siguiente ejemplo:

modelo de datos del sistema heredado (en realidad tan limpio, pero más adecuado para fines de demostración)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

metadatos

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

esquema XSD resultante

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

¿Qué opinas de eso? ¿Hay alguna manera de incluir metadatos en una hoja de estilo XSL?

¿Fue útil?

Solución

La mejor solución sería modificar los datos heredados agregando los metadatos faltantes.

Una instancia del " modelo de datos " modificado el vocabulario puede ser algo como esto:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

Colocar las nuevas propiedades en un espacio de nombres separado es una buena manera de distinguirlas fácilmente de las propiedades ya admitidas. Por lo general, no se recomienda el uso de atributos en un espacio de nombres, por lo que, si esto se va a evitar, se podrían usar subelementos (que pertenecen al nuevo espacio de nombres) en lugar de atributos. Hacer que los nuevos atributos pertenezcan a un espacio de nombres diferente puede provocar que la validación del esquema heredado no los rechace.

Si por alguna razón no es posible modificar los datos heredados, recomendaría no incluir las nuevas propiedades en la propia hoja de estilo XSLT (esto es perfectamente posible, por ejemplo, definiendo esto como el contenido de un < xsl: variable > ), pero para proporcionar estas nuevas propiedades como un archivo XML separado o como un conjunto de uno o más archivos XML.

Se puede acceder dinámicamente a cualquier archivo XML durante una transformación XSLT usando la función document () XSLT. Una instancia del archivo XML con las nuevas propiedades puede verse así:

<newProperties xmlns:nm="my:new.meta">
    <customer>
        <firstName nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age nm:nillable="true"/>
    </customer>
</newProperties>

Espero que esto haya ayudado.

Saludos,

Dimitre Novatchev

Otros consejos

" ¿Qué opinas de eso? "

Dos Tres cosas.

  1. Repara los metadatos heredados. Es XML Agregue cosas a esto. Agregue un espacio de nombres si es necesario.

  2. Si no puede arreglar los metadatos heredados, ¿quién mantendrá el segundo conjunto de metadatos que no están en notación XML? ¿Quién hará la doble entrada de hacer un cambio de metadatos? ¿Cuáles son las probabilidades de que alguien lo siga?

  3. Considere usar XML para los metadatos adicionales, no pseudo-XPath. La coherencia ayudará a los que vienen después de que descubras lo que está sucediendo.

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