2017-04-26 3 views
0

XMLのフォーマットを変更するために、PHP codeigniterフレームワークでXSLTを使用しています。詳細:親ノードがXML内に既に存在する場合、それを再生成しないようにする

入力は、私が

<xsl:template match="person_name"> 
    <frm:details> 
     <d:name> 
      <xsl:apply-templates/> 
     </d:name> 
    </frm:details> 
</xsl:template> 

<xsl:template match="person_address"> 
    <frm:details> 
     <d:address> 
      <xsl:apply-templates/> 
     </d:address> 
    </frm:details> 
</xsl:template> 

<xsl:template match="person_bloodGroup"> 
    <frm:health> 
     <d:bloodGroup> 
      <xsl:apply-templates/> 
     </d:bloodGroup> 
    </frm:health> 
</xsl:template> 

<xsl:template match="person_address"> 
    <frm:health> 
     <d:weight> 
      <xsl:apply-templates/> 
     </d:weight> 
    </frm:health> 
</xsl:template> 

としてXSLTを使用しています。しかし、それはFRMを生成し、私は

<data> 
    <frm:details> 
     <d:name>value</d:name> 
     <d:address>value</d:address> 
    </frm:details> 
    <frm:health> 
     <d:bloodGroup>value</d:bloodGroup> 
     <d:weight>value</d:weight> 
    </frm:health> 
</data> 

に変換したい

<data> 
    <person_name>value</person_name> 
    <person_address>value</person_address> 
    <person_bloodGroup>value</person_bloodGroup> 
    <person_weight>value</person_weight> 
</data> 

のようなものですタグを別々に2回名前と住所。私はXSLTに慣れていない。私は親ノードが既に存在するかどうかを確認して親ノードを再生成せずに子ノードを追加することができます。 私は

<frm:details> 
    <d:name>value</d:name> 
</frm:details> 

<frm:details> 
    <d:address>value</d:address> 
</frm:details> 

<frm:health> 
    <d:bloodGroup>value</d:bloodGroup> 
</frm:health> 

<frm:health> 
    <d:weight>value</d:weight> 
</frm:health> 
+0

[MCVE]を投稿してください。入力で 'person_name'と' person_address'の親要素と、現在のXSLTがそれをどのように処理するのかを確認する必要があります。 –

+0

元のXMLは大きすぎて共有する機密性がありません。私も同様のシナリオを作成しました。 person_nameとperson_addressは単一ノードになります。データノードとみなすことができる。ネストされたノードは入力に使用されません。 – hrishi

答えて

1

として出力dataノードに一致するテンプレートを追加し、そこに親要素を作成して取得しています。その後、関連する子ノードを扱うテンプレートを適用(およびこれらから、親の作成除く):あなたはこれを短縮することができ

<xsl:template match="/data"> 
    <xsl:copy> 
     <frm:details> 
      <xsl:apply-templates select="person_name | person_address"/> 
     </frm:details> 
     <frm:health> 
      <xsl:apply-templates select="person_bloodGroup | person_weight"/> 
     </frm:health> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="person_name"> 
    <d:name> 
     <xsl:apply-templates /> 
    </d:name> 
</xsl:template> 

<xsl:template match="person_address"> 
    <d:address> 
     <xsl:apply-templates/> 
    </d:address> 
</xsl:template> 

<xsl:template match="person_bloodGroup"> 
    <d:bloodGroup> 
     <xsl:apply-templates/> 
    </d:bloodGroup> 
</xsl:template> 

<xsl:template match="person_weight"> 
    <d:weight> 
     <xsl:apply-templates/> 
    </d:weight> 
</xsl:template> 

注:

<xsl:template match="/data"> 
    <xsl:copy> 
     <frm:details> 
      <d:name> 
       <xsl:value-of select="person_name"/> 
      </d:name> 
      <d:address> 
       <xsl:value-of select="person_address"/> 
      </d:address> 
     </frm:details> 
     <frm:health> 
      <d:bloodGroup> 
       <xsl:value-of select="person_bloodGroup"/> 
      </d:bloodGroup> 
      <d:weight> 
       <xsl:value-of select="person_weight"/> 
      </d:weight> 
     </frm:health> 
    </xsl:copy> 
</xsl:template> 
+0

ありがとう。しかし、私はfrmで追加したくない多くのノードが入力されています:詳細。彼らは別の親ノードの下に来るでしょう。上記のようにXSLTを適用すると、すべてのノードがfrm:detailsノードの下に置かれます。入力のすべてのノードはデータノード – hrishi

+0

"の下にあります。*上記のようにXSLTを適用すると、すべてのノードはfrm:detailsノードになります。*"いいえ、同じ 'data'親ノードの下にあるもののみです。それらのすべてを必要としない場合は、必要なテンプレートだけを選択的に適用します。 –

+0

すべてのノードがデータにあります。すべての要素に親ノードが1つしかありません – hrishi

関連する問題