Pergunta

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, string etc.).

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 as propriedades Java notação de atributos atribuir a um XPath.

Imagine a seguinte exemplo:

legado modelo de dados do sistema (na verdade 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

resultando XSD esquema

...
<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 disso? Existe uma maneira de incluir meta dados em uma folha de estilo XSL?

Foi útil?

Solução

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

Uma instância do "datamodel" vocabulário modificado 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 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 <xsl:variable> mundial ), mas para 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 do documento XSLT (). Uma instância do arquivo XML com as novas propriedades pode ser parecido com isto:

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

Cheers,

Dimitre Novatchev

Outras dicas

"O que você acha disso?"

Dois Três coisas.

  1. Corrigir os metadados legado. É XML. Adicionar coisas a ele. Adicionar um espaço de nomes, se for preciso.

  2. Se você não pode 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 alguém através do seguinte?

  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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top