XSLTを使用してフラットXMLファイルから階層XMLファイルを作成しようとしていますが、最善のアプローチがわかりません。
XMLには処理するデータ要素があり、各データ要素には「プロパティ」と「関係」があります。プロパティ-現在のデータに関連する情報が含まれています。関係-子要素(オブジェクト)と親IDに関連する情報が含まれます。
要素の親IDがない場合は、データをレベル1にグループ化し、後続の子要素をレベル2にグループ化する必要があります...以下に示す例には、4つのレベルまでのデータと関係が含まれています。実際のxmlには、さらに多くのレベルが含まれています。for-eachとchoose関数の組み合わせを試しましたが、2つのレベルまでしか取得できませんでした。XSLTでxmlを変換して完全なレベルを取得するのを手伝っていただければ幸いです。前もって感謝します!
入力XML:
<results>
<content>
<data>
<id>12345</id>
<properties>
<name>ABC</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>67890</id>
</data>
</object>
</relations>
</data>
<data>
<id>67890</id>
<properties>
<name>XYZ</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>22246</id>
</data>
</object>
<parent>
<data>
<id>12345</id>
</data>
</parent>
</relations>
</data>
<data>
<id>22246</id>
<properties>
<name>DEF</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>68681</id>
</data>
</object>
<parent>
<data>
<id>67890</id>
</data>
</parent>
</relations>
</data>
<data>
<id>68681</id>
<properties>
<name>UVW</name>
<date>2020-07-18</date>
</properties>
<relations>
<parent>
<data>
<id>22246</id>
</data>
</parent>
</relations>
</data>
<content>
</results>
期待される出力:
<results>
<content>
<Level>
<id>12345</id>
<properties>
<name>ABC</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>67890</id>
</data>
</object>
</relations>
<Leve2>
<id>67890</id>
<properties>
<name>XYZ</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>22246</id>
</data>
</object>
<parent>
<data>
<id>12345</id>
</data>
</parent>
</relations>
<Leve3>
<id>22246</id>
<properties>
<name>DEF</name>
<date>2020-07-18</date>
</properties>
<relations>
<object>
<data>
<id>68681</id>
</data>
</object>
<parent>
<data>
<id>67890</id>
</data>
</parent>
</relations>
<Leve4>
<id>68681</id>
<properties>
<name>UVW</name>
<date>2020-07-18</date>
</properties>
<relations>
<parent>
<data>
<id>22246</id>
</data>
</parent>
</relations>
</Leve4>
</Leve3>
</Leve2>
</Level>
<content>
</results>
階層:
<Level1>
Parent1
<Level2>
Child1
...
<Level3>
Child1a
...
<Level4>
Child1aa
...
</Level4>
</Level3>
</Level2>
<Level1>
<Level1>
Parent2
<Level2>
Child2
...
<Level3>
Child2a
...
<Level4>
Child2aa
...
</Level4>
</Level3>
</Level2>
<Level>
...
あなたは問題をあまり明確に説明していません。Xの<parent>
要素<id>
にYのへの参照が含まれている場合、出力でXをYの子にしたいことを前提としています(私がそれが問題であると正しければ、データは多くの問題とは無関係で、それを理解するのを邪魔するだけの混乱するもの)。
この仮定の下で、最初に、特定の親を持つアイテムを簡単に見つけることができるキーを定義します。
<xsl:key name = "parent-key" match = "content / data" use = "relations / parent / object / id" />
次に、1つのレコードを処理するときに、key()関数を使用してその子を取得します。
<xsl:template match="content/data">
<xsl:param name="level" select="1"/>
<xsl:element name="Level{$level}">
<xsl:copy-of select="."/>
<xsl:apply-templates select="key('parent-key', id)">
<xsl:with-param name="level" select="$level + 1"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
次に、最上位の要素から処理を開始します(この例では、これが最初の要素です。常にそうであるかどうかはわかりません)。
<xsl:template match="/">
<results>
<content>
<xsl:apply-templates select="data[1]"/>
</content>
</results>
</xsl:template>
未検証。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加