XMLファイルを再フォーマットするスクリプト
質問
XMLファイルをある形式から別の形式に変更しようとしていますが、スクリプトを書く方法についての手がかりがありません。誰かが助けてくれませんか?
ソースファイルは次のようになります:
<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>
これは、結果として必要な形式です。
<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>
どうもありがとう!
解決
XSLTはまさにその目的のために作られています。明確に定義されたXMLファイルを、異なるXML構造を含む他のプレーンテキスト形式に変換できます。たとえば、xsltprocを取得し、スクリプトを作成すると完了です。
最初にXSLTを学ぶ必要がある場合は、ここに良い出発点があります。 http://www.w3schools.com/xsl/ (このチュートリアルは、XHTMLへの変換の例を示していますが、XHTMLタグの代わりにターゲットXMLタグを使用する必要があります...)。
これはから始めるのに適したスクリプトかもしれません(申し訳ありませんが、ここに本格的なスクリプトを提供する時間はありません):
<?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>
あなたは与えることができます xsltproc このStyleSheetとソースXMLドキュメントでは、新しいXMLファイルが提供されます。たぶん、ソースXMLファイルが明確に定義されていることを確認する必要があります。 1 ルート要素。あなたの例はそれが持っているようには見えません、あなたはそれを任意の要素で囲む必要があるかもしれません。
XSLTとスクリプトについて少し詳しく説明するには:2つのポインターがあると想像してください。 XSLTスクリプトに1つ、XMLソースファイルに1つ。 XSLTは「テンプレートの適用」に関するものであり、常に最も近い一致であるテンプレートを使用します(テンプレートを何らかの機能と考えてください)。
最初は、最も近い一致がルート要素になるため、XSLTポインターはテンプレートで開始されます match="/"
. 。 XMLポインターは、XMLソースドキュメントのルート要素(エイリアス「タグ」)にあります。任意の要素 いいえ で始まります xsl:
出力要素と見なされます。したがって、まず第一に、xsltprocは <bestand>
エレメント。
その後、XSLTポインターがさらに進んで見つけます <apply-templates>
一致するすべての要素を選択します //Record
(二重スラッシュは「任意の深さで」を示します)。それぞれのため <Record>
要素、一致するテンプレートを「呼び出す」。ここで最も近い試合はそうでしょう <xsl:template match="Record">
.
したがって、XSLTポインターはテンプレートにジャンプし、XMLポインターは最初のポインターにジャンプします <Record>
. 。次に変数(nihil
)選択された記録からいくつかの情報が含まれていると宣言されています XMLポインター以降 XPath式を使用して、ソースドキュメントのXML構造に深く入ります。 Xpath式は次のように述べています。「要素から選択してください FieldValue
属性があります fieldName
値で 'rapportage_nihil'
属性の値 fieldValue
「(XMLデータの条項があるSQLのように考えてください。属性はここで前に付けられます @
).
出力ドキュメントに必要なすべての情報に対して、その行をコピー、貼り付け、変更する必要があります。次に、出力要素 <rapportage>
すべての変数を置き換え、評価されます(例: {$nihil}
)上記のそれぞれの値を使用して <xsl:variable>
. 。内部の要素を追加する必要があります <rapportage>
と同じ方法で要素 <rapportage>
エレメント。その後、テンプレートは終了し、次のテンプレートが終了します <Record>
テンプレートに配置されます。