1

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>  

どうもありがとう!

4

1 に答える 1

4

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 にこのスタイルシートとソース 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>. 次に、変数 ( ) が宣言されます。この変数には、XPath 式を使用してソース ドキュメントの XML 構造のさらに奥にあるXML ポインターからnihil選択されたレコードからの情報が含まれます。XPath 式は次のように述べています。「属性の値を持つ属性を持つ要素から選択します」 (XML データの SQL WHERE 句のように考えてください。ここでは、属性の前に が付きます)。FieldValuefieldName'rapportage_nihil'fieldValue@

出力ドキュメントで必要なすべての情報について、その行をコピーして貼り付け、変更する必要があります。次に、出力要素<rapportage>が評価され、すべての変数 (例: {$nihil}) が で設定されたそれぞれの値に置き換えられ<xsl:variable>ます。<rapportage>要素と同じ方法で、要素内に要素を追加する必要があり<rapportage>ます。次に、テンプレートは最後にあり、次<Record>はテンプレートを介して配置されます。

于 2010-04-21T16:48:44.277 に答える