Question

Je suis en train de modifier un fichier XML d'un format à un autre et ne pas avoir la moindre idée de la façon d'écrire un script pour elle. aider quelqu'un peut, s'il vous plaît?
Le fichier source ressemble à ceci:

<Record>
     <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
     <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
     <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
     <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
     <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
     <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
     <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
     <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
     <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
     <FieldValue fieldName="rij" fieldValue="r_24_100_1_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_100_1_000_0"/>
     <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
     <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
     <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
     <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
     <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
     <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
     <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
     <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
     <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.037E-4"/>
     <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
     <FieldValue fieldName="rij" fieldValue="r_24_108_0_000_0" fieldValueIsNull="false" fieldValueNatural="r_24_108_0_000_0"/>
     <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>
<Record>
    <FieldValue fieldName="rapportage_nihil" fieldValue="false" fieldValueIsNull="false" fieldValueNatural="false"/>
    <FieldValue fieldName="periode" fieldValue="2009-23-31" fieldValueIsNull="false" fieldValueNatural="2009-10-31 00:23:23"/>
    <FieldValue fieldName="formulierid" fieldValue="9001HK1V10" fieldValueIsNull="false" fieldValueNatural="9001HK1V10"/>
    <FieldValue fieldName="versie" fieldValue="1" fieldValueIsNull="false" fieldValueNatural="1"/>
    <FieldValue fieldName="frequentie" fieldValue="M" fieldValueIsNull="false" fieldValueNatural="M"/>
    <FieldValue fieldName="variant_type" fieldValue="Landen" fieldValueIsNull="false" fieldValueNatural="Landen"/>
    <FieldValue fieldName="value" fieldValue="5F" fieldValueIsNull="false" fieldValueNatural="5F"/>
    <FieldValue fieldName="post_value" fieldValue="0.00" fieldValueIsNull="false" fieldValueNatural="1.6049E-4"/>
    <FieldValue fieldName="cube" fieldValue="c01" fieldValueIsNull="false" fieldValueNatural="c01"/>
    <FieldValue fieldName="rij" fieldValue="r_06_000_1_010_0" fieldValueIsNull="false" fieldValueNatural="r_06_000_1_010_0"/>
    <FieldValue fieldName="kolom" fieldValue="c_2250_SPU" fieldValueIsNull="false" fieldValueNatural="c_2250_SPU"/>
</Record>

Ceci est le format que j'ai besoin en conséquence:

<bestand registratienummer="123">
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_24_100_1_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_24_108_0_000_0" kolom="c_2250_SPU" />
</rapportage>
<rapportage nihil="false" periode="2009-23-31" formulierid="9001HK1V10" versie="1" frequentie="M">
        <variant type="Landen" value="5F" />
        <post value="0.00" cube="c01" rij="r_06_000_1_010_0" kolom="c_2250_SPU" />
</rapportage>
</bestand>  

Merci beaucoup!

Était-ce utile?

La solution

XSLT est fait précisément pour cette fin. Vous pouvez transformer un fichier XML bien défini dans un autre format texte brut, y compris une structure XML différente. Obtenez par exemple xsltproc, écrire un script et vous avez terminé.

Si vous avez besoin d'apprendre d'abord XSLT, voici un bon point de départ: http: //www.w3schools. com / xsl / (ce tutoriel donne des exemples pour une transformation en XHTML, mais il vous suffit d'utiliser vos balises XML cibles au lieu des balises XHTML ...).

Cela pourrait être un bon script pour démarrer à partir (désolé, mais je n'ai pas le temps de vous donner un script à part entière ici):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" encoding="utf-8" />
    <xsl:template match="/">
        <bestand registratienummer="123">
            <apply-templates select="//Record"/>
        </bestand>
    </xsl:template>
    <xsl:template match="Record">
        <xsl:variable name="nihil" select="FieldValue[@fieldName='rapportage_nihil']/@fieldValue"/>
        <!-- add more variable lookups here. you need XPath for that. -->
        <rapportage nihil="{$nihil}" periode="{$periode}">
            <!-- add more output here -->
        </rapportage>
    </xsl:template>
</xsl:stylesheet>

Vous pourriez donner xsltproc cette feuille de style et votre document XML source, il vous donnera votre nouveau fichier XML. Peut-être que vous devez vous assurer que votre fichier XML source est bien définie, à savoir contient un élément racine. Votre exemple ne ressemble pas à ça a un, vous devrez peut-être de l'entourer d'un élément arbitraire.

Pour élaborer un peu sur le XSLT et le script: Imaginez que vous avez deux pointeurs. Un dans le script XSLT, un dans votre fichier source XML. XSLT est tout au sujet « application des modèles » et il utilisera toujours le modèle qui est le plus proche correspondance (Pensez à des modèles comme une sorte de fonction).

Dans un premier temps, la plus proche serait l'élément racine, de sorte que le pointeur XSLT commencerait dans le modèle avec match="/". Le pointeur XML est dans l'élément racine (alias « tag ») du document source XML. Tout élément de pas en commençant par xsl: serait considéré comme un élément de sortie. Donc, tout d'abord, xsltproc génèrerait l'élément de <bestand>.

Ensuite, le pointeur de XSLT va plus loin et trouve <apply-templates> sélectionnant tous les éléments correspondant à //Record (les désigne double barre oblique « en profondeur »). Pour chaque élément de <Record>, il « appel » le modèle correspondant. Ici, le match le plus proche serait <xsl:template match="Record">.

Ainsi, le pointeur XSLT sauterait au modèle, le pointeur XML à la première <Record>. Ensuite, une variable (nihil) est déclarée, contenant des informations du dossier qui est sélectionné à partir du pointeur XML partir plus profondément dans la structure XML du document source en utilisant une expression XPath. L'expression XPath dit: « Choisissez du FieldValue élément qui a un fieldName d'attribut avec la valeur 'rapportage_nihil' la valeur de l'fieldValue attribut » (Pensez-y comme une clause SQL WHERE pour les données XML, les attributs sont préfixés ici avec @).

Vous devez copier, coller et changer cette ligne pour chaque information dont vous avez besoin dans votre document de sortie. Ensuite, on évalue l'élément de sortie <rapportage>, en remplaçant chaque variable (par exemple {$nihil}) avec leurs valeurs respectives définies ci-dessus avec <xsl:variable>. Vous devez ajouter les éléments dans l'élément <rapportage> de la même façon que l'élément <rapportage>. Ensuite, le modèle est à sa fin et la prochaine <Record> sera mis à travers le gabarit.

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