metadados geração accionados com XSLT

votos
1

Estou criando regularmente um esquema XSD, transformando um modelo de um sistema legado de dados proprietário. Isso funciona muito bem. No entanto, o sistema legado só permite-me especificar atributos mais básicas de um parâmetro, tais como o tipo de dados ( int, stringetc.).

Eu gostaria de melhorar a transformação XSL com um mecanismo que permite-me para adicionar metadados a fim de fornecer mais detalhes para a transformação. Pensei em algo como o propriedades notação Java para atribuir atributos para um XPath.

Imagine a seguinte exemplo:

modelo de dados de sistemas legados (realmente que limpo, mas mais adequado para fins de demonstração)

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

metadados

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>
...

O que você acha daquilo? Existe uma maneira de incluir meta dados em uma folha de estilo XSL?

Publicado 11/11/2008 em 11:37
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

"O que você acha daquilo?"

Dois três coisas.

  1. Corrigir os metadados legado. É XML. Adicionar coisas a ele. Adicionar um espaço de nomes se você tiver que.

  2. Se não for possível corrigir os metadados legado, que vai maintaint ele segundo conjunto de metadados que não está na notação XML? Quem vai fazer a dupla entrada de fazer uma mudança de metadados? Quais são as chances de ninguém seguintes através?

  3. Considere o uso de XML para o metadados adicionais, não pseudo-XPath. Consistência vai ajudar aqueles que vêm depois de descobrir o que está acontecendo.

Respondeu 11/11/2008 em 13:12
fonte usuário

votos
2

A melhor solução seria modificar os dados legados, adicionando os metadados em falta.

Uma instância do vocabulário modificado "datamodel" pode ser algo como isto:

<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 as novas propriedades em um espaço separado é uma boa maneira de distingui-los facilmente a partir das propriedades já suportados. Geralmente usando atributos em um espaço de nomes não é recomendado, por isso, se isso é para ser evitado, pode-se utilizar sub-elementos (pertencentes ao novo namespace) em vez de atributos. Fazendo os novos atributos pertencem a um namespace diferente pode resultar na validação do esquema legado não rejeitá-los.

Se devido a algumas razões não é possível modificar os dados legados, eu recomendaria não incluir as novas propriedades na própria folha de estilo XSLT (isto é perfeitamente possível, por exemplo, como definir isso como o conteúdo de um mundial <xsl:variable>), mas a fornecer essas novas propriedades como um arquivo XML separado ou como um conjunto de um ou mais arquivos XML.

Qualquer arquivo XML pode ser acessada dinamicamente durante uma transformação XSLT usando a função XSLT document (). Uma instância do arquivo XML com as novas propriedades pode ser parecido com este:

<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 este ajudou.

Felicidades,

Dimitre Novatchev

Respondeu 13/11/2008 em 05:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more