/ / xml d'Excel avec 3 groupes identiques - conversion en un groupe répétitif - xml, excel, xslt

xml d'Excel avec 3 groupes identiques - convertir en un groupe répétitif - xml, excel, xslt

Je suis novice chez XML et XSLT. J'ai cherché quelque chose de similaire dans le forum sans succès. La traduction suivante est-elle possible avec XSLT? Il s’agit en fait d’un fichier XML dérivé d’un tableur Excel, composé de 3 groupes identiques répétés sur la même ligne, de sorte qu’ils portent des noms différents, groupe1,… 2 et… 3, que je souhaite transformer en un groupe répété 3 fois si il y a des données dedans. L'exemple ci-dessous est une version simplifiée:

<application>
<group1>
<name1>John</name1>
</group1>
<group2>
<name2>Mary</name2>
</group2>
<group3>
<name3>Peter</name3>
</group3>
</application>

convertir en

<application>
<group ref="001">
<line_no>001</line_no>
<name>John</name>
</group>
<group ref="002">
<line_no>002</line_no>
<name>Mary</name>
</group>
<group ref="003">
<line_no>003</line_no>
<name>Peter</name>
</group>
</application>

Excel ne se prête pas à l’exportation au format XML de la manière la plus simple.

Réponses:

0 pour la réponse № 1

Une feuille de style pourrait être:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(),"group")]">
<group ref="{format-number(substring-after(name(),"group"),"000")}">
<xsl:apply-templates/>
</group>
</xsl:template>
<xsl:template match="*[starts-with(name(),"name")]">
<line_no>
<xsl:value-of
select="format-number(substring-after(name(),"name"),"000")"/>
</line_no>
<name>
<xsl:apply-templates/>
</name>
</xsl:template>
</xsl:stylesheet>

Sortie:

<application>
<group ref="001">
<line_no>001</line_no>
<name>John</name>
</group>
<group ref="002">
<line_no>002</line_no>
<name>Mary</name>
</group>
<group ref="003">
<line_no>003</line_no>
<name>Peter</name>
</group>
</application>

0 pour la réponse № 2

Xslt a un position() une fonction. Cela devrait vous aider à obtenir le numéro devant le nom.

J'espère que cela t'aides.