2016-08-08 24 views
0

私はxsltを初めて使用しており、タグ名を動的に変更する必要があります。ソースXMLに示されているように、G_1にはMapIDSTAGE_COLUMN_NAMEが含まれます。ここからVO_ATTRIBUTE_NAMEを取得する必要があります。同じタグ名をG_2に置き換える必要があります。XML動的タグ名

ソースのXML -

<?xml version="1.0" encoding="UTF-8"?> 
<DATA_DS> 
    <G_1> 
     <MapID>100</MapID> 
     <STAGE_COLUMN_NAME>XXDATE001</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>StartDate</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>100</MapID> 
     <STAGE_COLUMN_NAME>XXDATE002</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>EndDate</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>100</MapID> 
     <STAGE_COLUMN_NAME>XXVAL001</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>OrgID</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>100</MapID> 
     <STAGE_COLUMN_NAME>XXVAL002</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>DepName</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>200</MapID> 
     <STAGE_COLUMN_NAME>XXDATE001</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>StartDate Two</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>200</MapID> 
     <STAGE_COLUMN_NAME>XXDATE002</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>EndDate Two</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>200</MapID> 
     <STAGE_COLUMN_NAME>XXVAL001</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>DepID</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_1> 
     <MapID>200</MapID> 
     <STAGE_COLUMN_NAME>XXVAL002</STAGE_COLUMN_NAME> 
     <VO_ATTRIBUTE_NAME>Division Name</VO_ATTRIBUTE_NAME> 
    </G_1> 
    <G_2> 
     <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID> 
     <MapID>100</MapID> 
     <XXVAL002>Emergency Dept.-East - 400750</XXVAL002> 
     <XXDATE001>1951-01-01T00:00:00.000+00:00</XXDATE001> 
     <XXDATE002>4712-12-31T00:00:00.000+00:00</XXDATE002> 
    </G_2> 
    <G_2> 
     <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID> 
     <MapID>200</MapID> 
     <XXVAL002>Emergency Division - 4353</XXVAL002> 
     <XXDATE001>1951-01-01T00:00:00.000+00:00</XXDATE001> 
     <XXDATE002>4712-12-31T00:00:00.000+00:00</XXDATE002> 
    </G_2> 
</DATA_DS> 

ターゲットXML

<?xml version="1.0" encoding="UTF-8"?> 
<DATA_DS> 
    <G_2> 
     <PHYSICAL_LINE_ID>100000007956555</PHYSICAL_LINE_ID> 
     <DepName>Emergency Dept.-East - 400750</DepName> 
     <StartDate>1951-01-01T00:00:00.000+00:00</StartDate> 
     <EndDate>4712-12-31T00:00:00.000+00:00</EndDate> 
    </G_2> 
     <G_2> 
     <PHYSICAL_LINE_ID>100000007956555</PHYSICAL_LINE_ID> 
     <Division Name>Emergency Division - 4353</Division Name> 
     <StartDate Two>1951-01-01T00:00:00.000+00:00</StartDate Two> 
     <EndDate Two>4712-12-31T00:00:00.000+00:00</EndDate Two> 
    </G_2> 
</DATA_DS> 

親切xsltコード可能な場合や、この方向での任意のヒントで私を助けて。

答えて

1

面白い少し問題です。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:key name="fields" match="//G_1" use="concat(MapID/text(), STAGE_COLUMN_NAME/text())"/> 
    <xsl:template match="/"> 
     <DATA_DS> 
      <xsl:apply-templates select="//G_2"/> 
     </DATA_DS> 
    </xsl:template> 
    <xsl:template match="G_2"> 
     <G_2> 
      <xsl:apply-templates select="*"/> 
     </G_2> 
    </xsl:template> 
    <xsl:template match="MapID"/> 
    <xsl:template match="*"> 
     <xsl:variable name="id" select="concat(../MapID/text(),name())"/> 
     <xsl:variable name="x" select="key('fields',$id)/VO_ATTRIBUTE_NAME/text()"/> 
     <xsl:choose> 
      <xsl:when test="$x"> 
       <xsl:element name="{translate($x,' ','-')}"> 
        <xsl:value-of select="text()"/> 
       </xsl:element> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy-of select="."/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

それはタグ名を参照するためのキー(マップ)を使用してマッピングを持っていない手つかずのタグを通過する:ここでは1つのXSLT 1.0ソリューションです。要素名にはスペースを含めることはできませんので、スペースをハイフンに変換しました。これは合法です。あなたのサンプル入力から

出力がある:あなたのジムへ

<?xml version="1.0" encoding="utf-8"?> 
<DATA_DS> 
    <G_2> 
     <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID> 
     <DepName>Emergency Dept.-East - 400750</DepName> 
     <StartDate>1951-01-01T00:00:00.000+00:00</StartDate> 
     <EndDate>4712-12-31T00:00:00.000+00:00</EndDate> 
    </G_2> 
    <G_2> 
     <PHYSICAL_LINE_ID>123456789</PHYSICAL_LINE_ID> 
     <Division-Name>Emergency Division - 4353</Division-Name> 
     <StartDate-Two>1951-01-01T00:00:00.000+00:00</StartDate-Two> 
     <EndDate-Two>4712-12-31T00:00:00.000+00:00</EndDate-Two> 
    </G_2> 
</DATA_DS> 
+0

ビッグおかげで...その作業は絶対fine.Youが – Bhushan

+0

左側にチェックマークをクリックして答えを「受け入れる」してください私を救いました。これは他の人があなたの問題を解決したことを知るように答えを記しています。 –