2016-10-07 18 views
0

私は3つの異なるXMLファイルを持っています。それらのコラムの一部と誰かがそうではありません。それらのordinalPositionは変化しています。毎回私は自分のftpで新しいファイルを取得し、1つずつ読み込んでシステムに読み込む必要があります。しかし、私はファイルの列名についてはわかりません。XSLT - 動的な地図の列

XML 1 : 
    <?xml version="1.0" encoding="UTF-8"?> 
    <SourceFile> 
     <Data> 
     <CustNo>126</CustNo> 
     <Gender/> 
     <isActive>0</isActive> 
     <Email/> 
     </Data> 
    </SourceFile> 

XML 2 : 
<?xml version="1.0" encoding="UTF-8"?> 
<SourceFile> 
    <Data> 
    <CustNo>124</CustNo> 
    <Phone/> 
    <Country/> 
    <isActive>1</isActive> 
    </Data> 
</SourceFile> 

XML 3: 
<?xml version="1.0" encoding="UTF-8"?> 
<SourceFile> 
    <Data> 
    <KeyId>123</KeyId> 
    <FirstName/> 
    <LastName/> 
    <Email/> 
    <isActive>0</isActive> 
    </Data> 
</SourceFile> 

私はXSLTで非常に新しいです。私はファイルが私のftpに到着したときは常に以下の出力を生成したい。

Result for XML 1 : 
    <?xml version="1.0" encoding="UTF-8"?> 
    <SourceFile> 
     <Data> 
     <KeyID>124</KeyID> <!-- CustNo will be mapped to KeyId --> 
     <FirstName/> 
     <LastName/> 
     <Email/> 
     <Phone/> 
     <Country/> 
     <isActive>0</isActive> 
     </Data> 
    </SourceFile> 

多くのおかげで、あなたは常に出力に存在する(人口か)すべて記載された要素を持つようにしたいということ、そしてあなたが与えられた順序でそれらをしたいと仮定すると メフメット

答えて

0

、あなた行うことができます:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/SourceFile"> 
    <xsl:copy> 
     <xsl:for-each select="Data"> 
      <xsl:copy> 
       <KeyID> 
        <xsl:value-of select="CustNo | KeyId"/> 
       </KeyID> 
       <FirstName> 
        <xsl:value-of select="FirstName"/> 
       </FirstName> 
       <LastName> 
        <xsl:value-of select="LastName"/> 
       </LastName> 
       <Email> 
        <xsl:value-of select="Email"/> 
       </Email> 
       <Phone> 
        <xsl:value-of select="Phone"/> 
       </Phone> 
       <Country> 
        <xsl:value-of select="Country"/> 
       </Country> 
       <isActive> 
        <xsl:value-of select="isActive"/> 
       </isActive> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
0

一つ試みは、次のようになります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Data"> 
     <xsl:copy> 
      <KeyID><xsl:value-of select="CustNo | KeyId"/></KeyID> 
      <FirstName><xsl:value-of select="FirstName"/></FirstName> 
      <Email><xsl:value-of select="Email"/></Email> 
      <Phone><xsl:value-of select="Phone"/></Phone> 
      <Country><xsl:apply-templates select="Country"/></Country> 
      <isActive><xsl:value-of select="isActive"/></isActive> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Country"> 
     <xsl:value-of select="."/> 
    </xsl:template> 

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

</xsl:stylesheet> 

説明:あなたは、常に期待される成果を作成Data要素で

<xsl:value-ofまたは<xsl:apply-templatesのいずれかが選択されると、ノードの内容が取得されます。<xsl:value-ofまたは<xsl:apply-templatesのいずれかが選択されると、ノードの内容が取得されます。

<xsl:value-of />は要素の文字列を返します。

<xsl:apply-templates />は最終的に他のテンプレートルールも実行します。これは、例えば子ノードがある場合に重要です。要素Countryの例ではこれが表示されます。

XMLとXSLTは大文字と小文字が区別されます。