2017-02-01 5 views
0

XMLファイルを特定のニーズに適した別のセットに変換する必要があります。 XMLの変換は新しいものではありませんが、要素から属性へ動的に変換することはやや面白いです。XML要素を属性に変換する

また、子要素のテキスト値を使用して親要素を照会する必要があります。

これは私が(データは匿名化された)を達成したいものです。

ソースファイル

<PARTS> 
    <PART> 
     <Name>Valve</Name> 
     <Code>1</Code> 
     <Color>Brown</Color> 
    </PART> 
    <PART> 
     <Name>Filter</Name> 
     <Code>2</Code> 
     <Color>Green</Color> 
    </PART> 
    <PART> 
     <Name>Plug</Name> 
     <Code>3</Code> 
     <Color>Brown</Color> 
    </PART> 
</PARTS> 

は、カラーサブ要素のフィルタリングを、XMLファイル1をターゲットに変換:

<PARTS> 
    <PART Name="Valve" Code=1 Color="Brown" /> 
    <PART Name="Plug" Code=3 Color="Brown" /> 
</PARTS> 

ターゲットXMLファイル2に変換、カラーサブ要素でフィルタリング:

<PARTS> 
    <PART Name="Filter" Code=2 Color="Green" /> 
</PARTS> 
+0

これは基本的なXSLTです。それについては「興味をそそられる」ものはありません。 'xsl:attribute'命令の使い方を学んだり、*属性値テンプレート*について学んでください。 –

答えて

1

ここにはいくつかのオプションがあります。強引な方法は、ちょうど

<xsl:template match="PART"> 
    <PART Name="{Name}" Code="{Code}" Color="{Color}"/> 
</xsl:template> 

またはより一般

<xsl:template match="PART"> 
    <xsl:for-each select="*"> 
    <xsl:attribute name="local-name()"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:for-each> 
</xsl:template> 

それとも、子要素を扱う一般化可能性を行うには、属性値テンプレート({..}中での発現などの属性値を入れる)を使用することですPARTの子ノード上の一般的なテンプレートを使用して:

<xsl:template match="PART/*"> 
    <xsl:attribute name="local-name()"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

また"Name | Color | Code"またはを一致させることができますが、後者はパフォーマンスが低い。

不要なノードを除外することは、別のプロセスです。コンテンツを持たない適切なマッチングテンプレートを定義すると、出力に何も生成されません。あなたの最初のケースでは、あなたが行うことができます

<xsl:template match="PART[Code=2]"/> 

この部分は、そのテンプレートで処理され、何も出力されません。このパターンのテンプレートは、単純な<xsl:template match="PART">テンプレートよりも優先度が高くなりますが、両方ともクリアするにはpriority属性を追加することをおすすめします。

2番目のケースでは、論理を容易にPART[Code!=2]で反転することもできます。明らかに、あなたの特定のニーズにこれを外挿してください。

+1

優秀!実際、非常に正確で洗練されたソリューションです。どうもありがとうございます。 –

関連する問題