XSLT

2012-03-13 10 views
0
を使用してXMLから別の親タグと一緒に子タグを取得する方法を

は、XSLTを書くために私が欲しい上記のXMLファイルを使用して、以下の入力XMLファイルXSLT

<Content> 
     <content1> 
     <first> Hi <dynVar name="abc" /> All </first> 
     <second>this is</second> 
     <content1> 
     <third>input <dynVar name="def" /> xml content</third> 
     <fourth> <dynVar name="ghi" /> </fourth> 
     <fifth> <dynVar name="jkl" /> <dynVar name="mno" /></fifth> 
<Content> 

を考えるように私の出力XMLファイルの後に 変換は ターゲットXMLファイルを以下のようになります。

<aaa> 
    <bbb> 
     <ccc> Hi <dynVar name="abc" /> All </ccc> 
     <ddd>this is</ddd> 
    <bbb> 
    <eee>input <dynVar name="def" /> xml content</eee> 
    <fff> <dynVar name="ghi" /> </fff> 
    <ggg> <dynVar name="jkl" /> <dynVar name="mno" /></ggg> 
<aaa> 

と出力ファイル が 入力XMLファイルに関連付けられている名前空間のいずれかを含めることはできません 誰もがこれに対する解決策を与えることができますか?

答えて

1

は(も終わりに短いバージョンを参照)、これを試してみてください:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="Content"> 
     <aaa> 
      <xsl:apply-templates/> 
     </aaa> 
    </xsl:template> 

    <xsl:template match="content1"> 
     <bbb> 
      <xsl:apply-templates/> 
     </bbb> 
    </xsl:template> 

    <xsl:template match="first"> 
     <ccc> 
      <xsl:apply-templates/> 
     </ccc> 
    </xsl:template> 

    <xsl:template match="second"> 
     <ddd> 
      <xsl:apply-templates/> 
     </ddd> 
    </xsl:template> 

    <xsl:template match="third"> 
     <eee> 
      <xsl:apply-templates/> 
     </eee> 
    </xsl:template> 

    <xsl:template match="fourth"> 
     <fff> 
      <xsl:apply-templates/> 
     </fff> 
    </xsl:template> 

    <xsl:template match="fifth"> 
     <ggg> 
      <xsl:apply-templates/> 
     </ggg> 
    </xsl:template> 

</xsl:stylesheet> 

応用あなたの入力に、これは「=属性除外-結果プレフィックスを追加し、名前空間を除くために

<?xml version="1.0" encoding="UTF-8"?> 
<aaa> 
    <bbb> 
     <ccc> Hi <dynVar name="abc"/> All </ccc> 
     <ddd>this is</ddd> 
    </bbb> 
    <eee>input <dynVar name="def"/> xml content</eee> 
    <fff> 
     <dynVar name="ghi"/> 
    </fff> 
    <ggg> 
     <dynVar name="jkl"/> 
     <dynVar name="mno"/> 
    </ggg> 
</aaa> 

を与えますxyz "をstylesheet要素に追加します。ここで、x、y、zは、さらに宣言された名前空間です。

まったく同じ実現しますが、ノード名は交換する必要がある各ノード用のテンプレートを持っていない短いバージョン:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes=""> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="*[name() != 'dynVar']"> 
     <xsl:variable name="eltName"> 
      <xsl:choose> 
       <xsl:when test="name()='Content'">aaa</xsl:when> 
       <xsl:when test="name()='content1'">bbb</xsl:when> 
       <xsl:when test="name()='first'">ccc</xsl:when> 
       <xsl:when test="name()='second'">ddd</xsl:when> 
       <xsl:when test="name()='third'">eee</xsl:when> 
       <xsl:when test="name()='fourth'">fff</xsl:when> 
       <xsl:when test="name()='fifth'">ggg</xsl:when> 
       <xsl:otherwise>error</xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:element name="{$eltName}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet>