ある XML ファイルから別の XML ファイルにいくつかの要素の名前を変更して、いくつかの要素をコピーするための XSLT テンプレートの作成に成功しました。
ただし、要素を取得して XML 構造の別の部分に移動する方法がわかりません。
この XML を変換したい:
<Hosts>
<Clusters>
<Cluster>
<Nodes>
<WindowsHost/>
</Nodes>
</Cluster>
</Clusters>
</Hosts>
に:
<Hosts>
<WindowsHosts>
<WindowsHost/>
</WindowsHosts>
</Hosts>
現在作業中の XSLT には以下が含まれます。
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
...そして、次のようなテンプレートを繰り返します。
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost/SomeElement">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
等々。すべての要素がコピーされるわけではなく、一部の要素名が変更されるため、コピーされる各要素には独自のテンプレートがあります。しかし、完全な XPath ではなく、要素名の変更に成功しただけです。
どんな助けでも大歓迎です。
ポール
あなたの応答は大歓迎です。しかし、明確にするために、私の例は単純すぎると思います。
私の既存の XSLT には、ある XML から別の XML にコピーする必要があるすべての要素のテンプレートがあるため、多くのテンプレート (ほぼ 1000) があり、XSLT ファイルの先頭では、既定でどの要素にも何も起こらないようになっています。簡単に言えば、私はあなたの答えのテクニックを試してみましたが、成功しませんでした.
要素がコピーされるシナリオは 3 つあります。
- そのままコピペ
- 要素名をコピーして変更する
- スキーマ内の別の場所にコピーする
既存の XSLT ファイルは、#1 と #2 の両方で機能します。#3 仕事に行けない。XSLT ファイルの詳細はこちら
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/SAN/ClientProfile">
<!-- copy element as is (working) -->
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/SAN/ClientProfile/Name">
<!-- copy element but change its name (working) -->
<CompanyName>
<xsl:apply-templates/>
</CompanyName>
</xsl:template>
<xsl:template match="/SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost">
<!-- copy to different part of schema (not working) -->
<WindowsHost>
<xsl:apply-templates/>
</WindowsHost>
</xsl:template>
だから、私はに変更/SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost
したい/SAN/EQLHosts/WindowsHosts/WindowsHost
。この要素のすべての子は、既にコピーされている要素と同じ方法で処理されます。
私の説明が明確であることを願っています。この情報があなたの答えを変えるのか、それとも私がただ密集しているだけなのか教えてください.
ポール