2016-08-08 5 views
0

저는 xslt을 처음 사용하고 동적으로 태그 이름을 변경해야합니다. 소스 XML에 표시된 것처럼 G_1MapIDSTAGE_COLUMN_NAME을 포함 할 것이며 여기에서 VO_ATTRIBUTE_NAME을 가져와야하며 G_2의 태그 이름으로 바꿔야합니다.XML 동적 태그 이름

소스 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 코드 가능한 경우 또는이 방향으로 어떤 힌트를 도와

<?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.

답변

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> 

그것은 태그 이름을 참조하기위한 키 (지도)를 사용하고 매핑이없는 그대로 태그를 통과 : 여기에 하나의 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

왼쪽에있는 체크 표시를 클릭하여 대답을 "동의 함"을하시기 바랍니다 저장 작업입니다. 이것은 다른 사람들이 귀하의 문제를 해결할 수 있도록 해답을 표시합니다. –