mpaisley
mpaisley

Reputation: 1

Transforming XML Attributes into XML Elements

I have the following XML input:

<?xml version="1.0" encoding="utf-8"?>
<DOCUMENT>
  <EXTERNALFILES>
    <PRIMARYFILE FileName="C:\MSSB\POC\Exports\13f78581-1501-4dd0-8cf3-a5a300ba4083\121110-26-2001031100092.TIF" />
  </EXTERNALFILES>
  <OCRTEXTFILES />
  <DOCUMENTINDEX Name="A2iA_CheckAmount">3304.49</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckCAR">3304.49</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckCodeline_OnUs1">28557833</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckCodeline_Transit">031100092</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckDate">10-26-2001</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckLAR">3304.49</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckNumber">1211</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="A2iA_CheckPayeeName">BCBSD</DOCUMENTINDEX>
  <DOCUMENTINDEX Name="CheckPayerName">SOFTPRO NORTH AMERICA, INC.</DOCUMENTINDEX>
</DOCUMENT>

I need to transform this into the following output:

<?xml version="1.0" encoding="utf-8"?>
<DOCUMENT>
    <A2iA_CheckAmount>3304.49</A2iA_CheckAmount>
    <A2iA_CheckCAR>3304.49</A2iA_CheckCAR>
    <A2iA_CheckLAR>3304.49</A2iA_CheckLAR>
    <A2iA_CheckAccountNumber>28557833</A2iA_CheckAccountNumber>
    <A2iA_CheckRoutingNumber>031100092</A2iA_CheckRoutingNumber>
    <A2iA_CheckNumber>1211</A2iA_CheckNumber>
    <A2iA_CheckAmount>3304.49</A2iA_CheckAmount>
    <A2iA_CheckPayeeName>BCBSD</A2iA_CheckPayeeName>
    <CheckPayerName>SOFTPRO NORTH AMERICA, INC</CheckPayerName>
</DOCUMENT>

I am using the following XSLT code:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
        <xsl:value-of select="concat('<DOCUMENT>')"/>
            <xsl:template match="/*">
            <xsl:for-each select="DOCUMENT/DOCUMENTINDEX/@*">
                <xsl:value-of select="concat('<', name(), '>', ., '</', name(), '>')"/>
            </xsl:for-each>
        <xsl:value-of select="concat('</DOCUMENT>')"/>
    </xsl:template>

I tested this with an online XSLT Tester and it threw a non-descriptive error. I am new to XSLT Transformation. Any help will be greatly appreciated. Thank You.

Upvotes: 0

Views: 74

Answers (1)

zx485
zx485

Reputation: 29052

One possibility to achieve this is the following simple one(EDITED):

<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="/DOCUMENT">
    <xsl:element name="Document">
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>
<xsl:template match="DOCUMENTINDEX">
    <xsl:element name="{@Name}">
        <xsl:value-of select="text()" />
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

It gives the output (EDITED)

<Document>
  <A2iA_CheckAmount>3304.49</A2iA_CheckAmount>
  <A2iA_CheckCAR>3304.49</A2iA_CheckCAR>
  <A2iA_CheckCodeline_OnUs1>28557833</A2iA_CheckCodeline_OnUs1>
  <A2iA_CheckCodeline_Transit>031100092</A2iA_CheckCodeline_Transit>
  <A2iA_CheckDate>10-26-2001</A2iA_CheckDate>
  <A2iA_CheckLAR>3304.49</A2iA_CheckLAR>
  <A2iA_CheckNumber>1211</A2iA_CheckNumber>
  <A2iA_CheckPayeeName>BCBSD</A2iA_CheckPayeeName>
  <CheckPayerName>SOFTPRO NORTH AMERICA, INC.</CheckPayerName>
</Document>

Upvotes: 1

Related Questions