Domanda

Sto cercando di modificare un file XML da un formato ad un altro e non hanno alcuna idea di come scrivere uno script per esso. Qualcuno può aiutarmi, per favore?
L'aspetto file sorgente come questo:

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

Questo è il formato che ho bisogno di conseguenza:

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

Grazie mille!

È stato utile?

Soluzione

XSLT è fatto proprio per questo scopo. Si potrebbe trasformare qualsiasi file XML ben definito in qualsiasi altro formato di testo normale, tra cui una diversa struttura XML. Prendi per esempio xsltproc, scrivere la sceneggiatura e il gioco è fatto.

Se avete bisogno di imparare XSLT prima, ecco un buon punto di partenza: http: //www.w3schools. com / XSL / (questo tutorial fornisce esempi di una trasformazione a XHTML, ma basta per usare il tuo target di tag XML invece di tag XHTML ...).

Questa potrebbe essere una buona sceneggiatura di partire da (mi dispiace, ma non ho tempo per darvi uno script pieno titolo qui):

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

Si potrebbe dare xsltproc questo foglio di stile e il vostro documento XML di origine, che ti do il nuovo file XML. Forse è necessario assicurarsi che il file XML di origine è ben definito, vale a dire contiene una elemento radice. Il tuo esempio non sembra è ottenuto uno, potrebbe essere necessario lo circondano con un elemento arbitrario.

Per elaborare un po 'sul XSLT e lo script: Immaginate di avere due puntatori. Uno nello script XSLT, uno nel tuo file sorgente XML. XSLT è tutto "modelli che applicano" e sarebbe sempre utilizzare il modello che è la corrispondenza più vicina (Pensate a modelli come una sorta di funzione).

In un primo momento, la corrispondenza più vicina sarebbe l'elemento radice, in modo che il puntatore XSLT inizierebbe nel modello con match="/". Il puntatore XML è nell'elemento radice (alias "tag") del documento sorgente XML. Qualsiasi elemento che di non a partire xsl: sarebbe considerato come un elemento di uscita. Quindi, prima di tutto, xsltproc sarebbe uscita l'elemento <bestand>.

Poi il puntatore XSLT va oltre e reperti <apply-templates> selezionando tutti gli elementi corrispondenti //Record (i denota doppia barra "in qualsiasi profondità"). Per ogni elemento <Record>, sarebbe "chiamata" il modello di corrispondenza. Qui la corrispondenza più vicina sarebbe <xsl:template match="Record">.

Quindi il puntatore XSLT salterebbe al modello, il puntatore XML per la prima <Record>. Poi una variabile (nihil) viene dichiarato, contenente alcune informazioni dal record che viene selezionato dal puntatore XML poi più in profondità nella struttura XML del documento di origine usando un'espressione XPath. L'espressione XPath dice: "Selezionare dal FieldValue elemento che ha un fieldName attributo con il valore di 'rapportage_nihil' il valore del fieldValue attributo" (Pensate a come una clausola SQL WHERE per i dati XML; Gli attributi sono preceduti dal prefisso qui con @).

È necessario copiare, incollare e cambiare quella linea per ogni informazione necessaria nel documento di output. Poi l'elemento <rapportage> uscita viene valutata, sostituendo ogni variabile (ad esempio {$nihil}) con i rispettivi valori impostati in precedenza con <xsl:variable>. È necessario aggiungere gli elementi all'interno dell'elemento <rapportage> nello stesso modo come l'elemento <rapportage>. Poi il modello è al suo fine e la prossima <Record> sarà messo attraverso il modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top