0

I'm having trouble to stop the XSLT transformation when there's already an ID transform for it. I already have the idea how to combine the missing piece once transformation avoid to be duplicated.

Any help will really appreciated, thanks!

MY XML FILE

   ?xml version="1.0" encoding="UTF-8"?>
<row>
    <data>
        <id>1</id>
        <fname>Vcut</fname>
        <lname>Piatos</lname>
        <age>0</age>
        <code>1002</code>
        <hobby>dota</hobby>
    </data>
    <data>
        <id>1</id>
        <fname>Mayo</fname>
        <lname>Naise</lname>
        <age>22</age>
        <code>1003</code>
        <hobby>program</hobby>
    </data>
 <data>
        <id>2</id>
        <fname>Ben</fname>
        <lname>Ten</lname>
        <age>22</age>
        <code>1003</code>
        <hobby>Eat</hobby>
    </data>
</row>

XSLT TRANSLATION

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">

 <xsl:for-each select="row/data">
<EmployeeID>
<xsl:for-each-group select="id" group-by="id">
 <xsl:value-of select="current-grouping-key()"/>
</xsl:for-each-group>
    </EmployeeID>
         <EmployeeName>
         <xsl:value-of select='concat(fname," ",lname)' />
        </EmployeeName>
      <EmployeeAge>
            <xsl:value-of select='age'/>
    </EmployeeAge>
      <EmployeeCode><xsl:value-of select="code"/></EmployeeCode>
      <EmployeeActivity><xsl:value-of select="hobby"/></EmployeeActivity>
   ------------------------------------------------------------------------
</xsl:for-each>

</xsl:template>


</xsl:stylesheet>

OUTPUT

<?xml version="1.0" encoding="UTF-8"?>
<EmployeeID>1</EmployeeID>
<EmployeeName>Vcut Piatos</EmployeeName>
<EmployeeAge>0</EmployeeAge>
<EmployeeCode>1002</EmployeeCode>
<EmployeeActivity>dota</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID/>
<EmployeeName>Mayo Naise</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>program</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID>2</EmployeeID>
<EmployeeName>Ben Ten</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>Eat</EmployeeActivity>
   ------------------------------------------------------------------------

DESIRED OUTPUT

<?xml version="1.0" encoding="UTF-8"?>
<EmployeeID>1</EmployeeID>
<EmployeeName>Vcut Piatos</EmployeeName>
<EmployeeAge>0</EmployeeAge>
<EmployeeCode>1002</EmployeeCode>
<EmployeeActivity>dota</EmployeeActivity>
<EmployeeActivity>program</EmployeeActivity>
   ------------------------------------------------------------------------
<EmployeeID>2</EmployeeID>
<EmployeeName>Ben Ten</EmployeeName>
<EmployeeAge>22</EmployeeAge>
<EmployeeCode>1003</EmployeeCode>
<EmployeeActivity>Eat</EmployeeActivity>
   ------------------------------------------------------------------------
1
  • 1
    The output you claim is not the output received when using your code: xsltransform.net/bnnZVN There are no EmployeeID values. Commented Oct 31, 2015 at 14:44

1 Answer 1

1

You need to group data by id, not id by id - and you need to do this from the context of row, not from the context of data:

XSLT 2.0

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

<xsl:template match="/row">
    <xsl:for-each-group select="data" group-by="id">
        <EmployeeID>
            <xsl:value-of select="current-grouping-key()"/>
        </EmployeeID>
        <EmployeeName>
            <xsl:value-of select='concat(fname," ",lname)' />
        </EmployeeName>
        <EmployeeAge>
            <xsl:value-of select='age'/>
        </EmployeeAge>
        <EmployeeCode>
            <xsl:value-of select="code"/>
        </EmployeeCode>
        <EmployeeActivity>
            <xsl:value-of select="hobby"/>
        </EmployeeActivity>
------------------------------------------------------------------------
    </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>

Note:

  1. The result is not well-formed XML, as it has no single root element;
  2. The text separator may be helpful for the human reader, but may prove an obstacle for further processing - consider using a comment instead;
  3. The result obtained is different from what you posted: the first employee's activity is data, not program.
Sign up to request clarification or add additional context in comments.

1 Comment

Apologies, comment is not showing in the transform data's. You nailed it perfectly this is my desired output I'll take care of the other conditions. Thanks a lot for the help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.