Comment puis-je autoriser des formats de fichier XML définissables par l'utilisateur?

StackOverflow https://stackoverflow.com/questions/800074

  •  03-07-2019
  •  | 
  •  

Question

Je souhaite autoriser les utilisateurs à télécharger des fichiers contenant des informations de transaction sur mon application. Je souhaite que les utilisateurs puissent utiliser leur propre format de fichier (XML ou CSV).

Je vais donc avoir besoin d'une transformation de leur format en mon format avant de poursuivre le traitement. Je ne souhaite pas créer manuellement ce fichier XSLT chaque fois qu'un utilisateur utilise un nouveau format de fichier. Je souhaite donc créer une interface utilisateur pour créer essentiellement ce document XSLT.

Ceci est relativement facile pour un format de fichier CSV. L'utilisateur dit que le premier élément est mappé sur le champ x de mon côté, le deuxième élément mappe sur 7 champs, etc.

Cela devient plus compliqué lorsque le format de fichier est XML avec des éléments imbriqués, etc. Quelqu'un connaît-il un bon paradigme d'interface utilisateur pour le faire? Des exemples que je peux regarder sur le web ou ailleurs? J'imagine que l'utilisateur devra décrire un xpath complet dans le cadre du mappage, ou peut-être tout d'abord télécharger un fichier XSD et l'utiliser pour sélectionner des éléments pour le mappage (après quoi il me faudra générer le XSLT).

J'apprécie toutes les idées.

Était-ce utile?

La solution

Si le XML d'entrée peut être mappé de manière simple sur votre format XML, un ensemble d'expressions XPath sera requis de l'utilisateur.

Par " voie directe " Je veux dire une approche très basique <xsl:apply-templates>. Le fichier XML d'entrée doit comporter des enregistrements individuels pouvant être traités sans ambiguïté, contenant toutes les données dans le bon format. Aucune donnée ne nécessiterait de calcul ou un autre traitement spécial plus complexe que ce qui peut être obtenu en évaluant une seule expression XPath.

Si l'entrée est:

<root>
  <entry id="1" name"foo">
    <data1>somevalue
      <data2>othervalue</data2>
    </data1>
  </entry>
</root>

et le résultat souhaité serait:

<records>
  <record>
    <id>1</id>
    <name>foo</name>
    <data1>somevalue</data1>
    <data2>othervalue</data2>
  </record>
</records>

l'utilisateur devra alors fournir les mappages suivants:

  • élément racine: " racine "
  • élément d'enregistrement: " entrée "
  • id: & "; @id &";
  • nom: & "; @name &";
  • data1: " data1 "
  • data2: " data1 / data2 "

et le XSLT ressemblent à ceci (les valeurs entre & "% &" doivent être remplacées par les expressions XPath réelles de la configuration de mappage ci-dessus):

<xsl:template match="/">
  <records>
    <xsl:apply-templates select="%root element%/%record element%" />
  </records>
</xsl:template>

<xsl:template match="%root element%/%record element%">
  <record>
    <id>
      <xsl:value-of select="%id-xpath%[1]" />
    </id>
    <name>
      <xsl:value-of select="%name-xpath%[1]" />
    </name>
    <!-- and so on -->
  </record>
</xsl:template>

Autres conseils

Si je comprends bien, vous pensez à l'interface utilisateur nécessaire pour créer le xslt dont vous avez besoin. Je pars du principe qu'il s'agit d'une application Web. Une approche consisterait à utiliser xslt qui rend le fichier XML d'entrée au format HTML (celui que j'ai tendance à utiliser est xmlverbatim ). Vous pouvez modifier ce xslt pour créer des liens vers des nœuds. En outre, vous pouvez utiliser certains xslt pour générer le xpath pour cet élément et en faire une partie du lien. J'utilise ceci (posté par Jeni Tennison sur la liste XSL il y a quelques années)

  <xsl:for-each select="ancestor-or-self::*">
    <xsl:text />/<xsl:value-of select="name()" />
    <xsl:text />[<xsl:number />]<xsl:text />
  </xsl:for-each>

Ceci fait, vous obtiendrez un rendu visuel du code XML (plutôt que les vues données par MSIE et Firefox), mais avec des liens supplémentaires vers votre application. Vos utilisateurs pourraient alors sélectionner les nœuds d’intérêt. Ils vous ont ensuite fourni les xpaths dont vous avez besoin sans avoir à les écrire eux-mêmes.

Générer le xslt si vous avez le xpath est considérablement plus facile. La suggestion de Tomalek ci-dessus semble un moyen valable. Si vous n'avez pas réellement besoin de xml comme sortie finale, vous feriez mieux d'utiliser simplement un analyseur syntaxique xml qui vous permet de sélectionner des noeuds en fonction d'un xpath.

Cela deviendrait plus complexe si les informations que vous recevez contiennent bien sûr un nombre arbitraire d'enregistrements. Si tel est le cas, vous pouvez utiliser une approche en plusieurs étapes et utiliser la technique que j'ai expliquée ci-dessus pour extraire un enregistrement de l'entrée, puis utiliser l'approche pour identifier les champs individuels dans l'enregistrement.

Altova MapForce est un produit commercial permettant de mapper un schéma XML sur un autre. et générer une transformation XSL.

Vous pouvez consulter leur version d'évaluation et voir comment ils ont résolu ce problème plutôt complexe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top