2017-10-24 12 views
0

私はある構造のXMLを別の構造に変換する必要があるプロジェクトに取り組んでいます。私は別のノードの中からノードを横断するという問題に立ち往生しました。 私のプロジェクトには多くの要素と属性が含まれているため、サンプルの入出力XMLファイルを作成しました。それらは以下の通りです。XSLを使用して1つのXML構造を別のXML構造に変換する

input.xmlに:

<GENERIC_SYSTEM_PARAMETERS> 
    <Companies> 
     <Company ID="10" Name="Cmp_1"/> 
     <Company ID="20" Name="Cmp_2"/> 
     <Company ID="30" Name="Cmp_3"/> 
    </Companies> 
    <Persons> 
     <Person id="1"> 
      <Company_ID>10</Company_ID> 
      <Age>30</Age> 
     </Person> 
     <Person id="2"> 
      <Company_ID>10</Company_ID> 
      <Age>40</Age> 
     </Person> 
     <Person id="3"> 
      <Company_ID>20</Company_ID> 
      <Age>50</Age> 
     </Person> 
    </Persons> 
</GENERIC_SYSTEM_PARAMETERS> 

のOutput.xml:

<Main> 
    <Companies> 
     <Company id="10" Name="Cmp_1"> 
      <Employees> 
       <Employee id="1"> 
        <Age>30</Age>     
       </Employee> 
       <Employee id="2"> 
        <Age>40</Age>     
       </Employee> 
      </Employees> 
     </Company> 
     <Company id="20" Name="Cmp_2"> 
      <Employees> 
       <Employee id="3"> 
        <Age>50</Age>     
       </Employee> 
      </Employees> 
     </Company> 
    </Companies> 
</Main> 

は私にさらに進行するためにいくつかのアイデア/サンプルXSLファイルを教えてください。

ありがとうございます。

<xsl:template match="Company"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <Employees> 
     <xsl:apply-templates select="../../Persons/Person[Company_ID = current()/@ID]"/> 
    </Employees> 
    </xsl:copy> 
</xsl:template> 

を、必要に応じてソースにPersonノードからEmployeeノードを起動するためのテンプレートを追加します。

+1

ここで 'xsl:key'を使うと便利ですが、問題がある場合は、現在試したコードを投稿してください。ありがとうございました! –

+2

さらに進む方法は、変換したいことを考えてから、XSLTに書き込もうとします。がんばろう! –

答えて

0

これを試してみてください。

0

説明から始めましょう。

テンプレートマッチングGENERIC_SYSTEM_PARAMETERSは、 と同じように動作しますが、要素名は変更されます。

テンプレートマッチング会社には、ロジックの主要部分が含まれています。 従業員のいない企業を「ブロック」するには、従業員数を にチェックします。

数が正の場合、それ:

  • コピー元の開始タグ、
  • コピー独自の属性(適用-テンプレート)、
  • 従業員要素を開き、
  • その中にそれぞれの従業員が印刷されますが、いくつかの変更があります(下記参照)。

テンプレートマッチングは、ロジックの別の重要な部分 が含まれています。それ:

  • は、
  • コピー独自の属性、そうのcompany_idがコピーされていない
  • のみをコピーし、その子年齢要素を、タグ名を変更します。

テンプレートマッチングは、実際にはアイデンティティーテンプレートによって、この要素の 「正常な」処理をブロックし、何もしません。

ここでは完全なスクリプトです。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="GENERIC_SYSTEM_PARAMETERS"> 
    <Main><xsl:apply-templates select="*"/></Main> 
    </xsl:template> 

    <xsl:template match="Company"> 
    <xsl:variable name="myEmploees" select="../../Persons/Person[Company_ID = current()/@ID]"/> 
    <xsl:if test="count($myEmploees) &gt; 0"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <Employees> 
      <xsl:apply-templates select="../../Persons/Person[Company_ID = current()/@ID]"/> 
     </Employees> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="Persons"/> 

    <xsl:template match="Person"> 
    <Employee> 
     <xsl:apply-templates select="@*|Age"/> 
    </Employee> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
    </xsl:template> 
</xsl:transform> 
+0

ありがとうございました。このロジックは私には有益です。 – VinayCH

関連する問題