2016-08-08 62 views
0

Ich bin neu in xslt und ich muss Tag-Namen dynamisch ändern. Wie in Source XML gezeigt, G_1 enthält MapID und STAGE_COLUMN_NAME, Wir müssen VO_ATTRIBUTE_NAME von hier und das gleiche sollte mit Tag-Namen in G_2 ersetzt werden.Name des dynamischen XML-Tags

Quelle 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> 

Ziel 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> 

Bitte helfen Sie mir mit xslt Code, wenn möglich, oder jeden Hinweis in diese Richtung.

Antwort

1

Interessantes kleines Problem. Hier ist eine XSLT 1.0 Lösung:

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

Es verwendet einen Schlüssel (Karte) den Tag-Namen nachzuzuschlagen und führt durch unberührten Tags, die keine Zuordnungen. Beachten Sie, dass Elementnamen keine Leerzeichen enthalten dürfen. Daher habe ich die Leerzeichen in Bindestriche umgewandelt, die zulässig sind.

Ausgabe von Ihrem Abtastwerteingang ist:

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

Big Dank Ihnen Jim .. seine Arbeits absolut fine.You mich gerettet – Bhushan

+0

Bitte „accept“ die Antwort durch das Häkchen auf der linken Seite klicken. Dies ist die Antwort, damit andere wissen, dass es Ihr Problem gelöst hat. –