Arun
Arun

Reputation: 435

XML manipulation. 2 Input source XML

I have got 2 source to the XSLT, which needs to be mapped to the target. Have given below the source and desired output. The first source XML is in a collection which needs to be iterated to fetch the value.

Input Payload:

XML 1:

<ParticipentsCollection>
<Participents>
<Email>[email protected]</Email>
<Role>PM</Role>
</Participents>
<Participents>
<Email>[email protected]</Email>
<Role>BM</Role>
</Participents>
<Participents>
<Email>[email protected]</Email>
<Role>CM</Role>
</Participents>
</ParticipentsCollection>

XML 2:

<Project>
<ID>1</ID>
<Name>XYZ</Name>
<Status>Req Gathering</Status>
</Project>

Desired Output:

<ProjectDetails>
<ID>1</ID>
<Name>XYZ</Name>
<Status>Req Gathering</Status>
<PM>[email protected]</PM>
<BM>[email protected]</BM>
<CM>>[email protected]</CM>
</ProjectDetails>

Upvotes: 0

Views: 70

Answers (1)

Navin Rawat
Navin Rawat

Reputation: 3138

If you are using XSLT 1.0 use:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:exslt="http://exslt.org/common"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="exslt msxsl">
  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="Doc2"><xsl:copy><xsl:copy-of select="document('Untitled2.xml')/Project"></xsl:copy-of></xsl:copy></xsl:param>
  <xsl:template match="ParticipentsCollection">
    <ProjectDetails>
      <xsl:copy-of select="exslt:node-set($Doc2)/Project/*"/>
      <xsl:for-each select="Participents">
        <xsl:element name="{Role}"><xsl:value-of select="Email"/></xsl:element>
      </xsl:for-each>
    </ProjectDetails>
  </xsl:template>
</xsl:stylesheet>

and if 2.0 use:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="Doc2"><xsl:copy><xsl:copy-of select="document('Untitled2.xml')/Project"></xsl:copy-of></xsl:copy></xsl:param>
  <xsl:template match="ParticipentsCollection">
    <ProjectDetails>
      <xsl:copy-of select="$Doc2/Project/*"/>
      <xsl:for-each select="Participents">
        <xsl:element name="{Role}"><xsl:value-of select="Email"/></xsl:element>
      </xsl:for-each>
    </ProjectDetails>
  </xsl:template>
  </xsl:stylesheet>

I am running this XSLT on XML1 and keeping XML2 in $Doc2 param to get output:

<ProjectDetails>
   <ID>1</ID>
   <Name>XYZ</Name>
   <Status>Req Gathering</Status>
   <PM>[email protected]</PM>
   <BM>[email protected]</BM>
   <CM>[email protected]</CM>
</ProjectDetails>

Upvotes: 1

Related Questions