Jump to content

Problem in Recursion with XSLT 1.0


sadiqmodan

Recommended Posts

Hello, I have created one XSLT which is transforming one XML to another XML. Sample XML.

<Answers>  <AnswerSet ID="1142">       <Answer questionId="Name">testttttt123</Answer>    <Answer questionId="TesCal">1/26/2012 12:00:00 AM</Answer>    <Answer questionId="testPhoto" IsProcessed="True">Node1216sadi20120113.JPG</Answer>    <Answer questionId="Testrr" RepeatRegion="0" RegionName="Sam">rr111</Answer>    <Answer questionId="Testrr1" RepeatRegion="0" RegionName="Sam">123456</Answer>    <Answer questionId="Testrr" RepeatRegion="1" RegionName="Sam">rr1112</Answer>    <Answer questionId="Testrr1" RepeatRegion="1" RegionName="Sam">456789</Answer>    <Answer questionId="Testrr" RepeatRegion="2" RegionName="Sam">rr1113</Answer>    <Answer questionId="Testrr1" RepeatRegion="2" RegionName="Sam">4577855</Answer>    <Answer questionId="Testrr" RepeatRegion="3" RegionName="Sam" />    <Answer questionId="Testrr1" RepeatRegion="3" RegionName="Sam" />    <Answer questionId="Testrr" RepeatRegion="4" RegionName="Sam" />    <Answer questionId="Testrr1" RepeatRegion="4" RegionName="Sam" />    <Answer questionId="testPhoto12" IsProcessed="True">Node1216sadi20120113.JPG</Answer>  </AnswerSet></Answers>

XSLT is

<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">  <xsl:param name="NodeID"></xsl:param>  <xsl:param name="NodeType"></xsl:param>  <xsl:param name="NodeVirtual"></xsl:param>  <xsl:param name="NodeName"></xsl:param>  <xsl:param name="NodeTypeID"></xsl:param>  <xsl:param name="ParentID"></xsl:param>  <xsl:output indent="yes"/>  <xsl:template match="Answers">    <Node>	  <!--NodeID-->	  <xsl:element name="NodeID">	    <xsl:value-of select="$NodeID"/>	  </xsl:element>	  <!--NodeType-->	  <xsl:element name="NodeType">	    <xsl:value-of select="$NodeType"/>	  </xsl:element>	  <!--NodeTypeID-->	  <xsl:element name="NodeTypeID">	    <xsl:value-of select="$NodeTypeID"/>	  </xsl:element>	  <!--NodeVirtual-->	  <xsl:element name="NodeVirtual">	    <xsl:value-of select="$NodeVirtual"/>	  </xsl:element>	  <!--NodeVirtual-->	  <xsl:element name="NodeName">	    <xsl:value-of select="$NodeName"/>	  </xsl:element>	  <!--ParentID-->	  <xsl:element name="ParentID">	    <xsl:value-of select="$ParentID"/>	  </xsl:element>	  <xsl:apply-templates select="AnswerSet/Answer[1]"/>    </Node>  </xsl:template>  <xsl:template match="AnswerSet/Answer[not(@type = 'list') and not(@RegionName)]">    <xsl:element name="{@questionId}">	  <xsl:value-of select="."/>    </xsl:element>    <xsl:apply-templates select="following-sibling::Answer[1]"/>  </xsl:template>  <xsl:template match="AnswerSet/Answer[(@RegionName)]">    <xsl:element name="{@RegionName}">	  <xsl:element name="{@questionId}">	    <xsl:if test="@type = 'list'">		  <Items>		    <xsl:value-of select="."/>		  </Items>	    </xsl:if>	    <xsl:if test="not(@type = 'list')">		  <xsl:value-of select="."/>	    </xsl:if>	  </xsl:element>  	  <xsl:apply-templates select="." mode="Regionlist"/>      </xsl:element>    <xsl:variable name="next1" select="following-sibling::Answer[@RegionName = current()/@RegionName and @RepeatRegion != current()/@RepeatRegion][1]"/>    <xsl:if test="$next1">	  <xsl:apply-templates select="$next1"/>    </xsl:if>       <xsl:apply-templates select="following-sibling::Answer[not(@RegionName = current()/@RegionName)][1]"/>  </xsl:template>  <!--<xsl:template match="AnswerSet/Answer[(@RegionName)]" mode="RepeatRegionID">    <xsl:element name="{@RegionName}">	  <xsl:element name="{@questionId}">	    <xsl:if test="@type = 'list'">		  <Items>		    <xsl:value-of select="."/>		  </Items>	    </xsl:if>	    <xsl:if test="not(@type = 'list')">		  <xsl:value-of select="."/>	    </xsl:if>	  </xsl:element>	  <xsl:apply-templates select="." mode="Regionlist"/>    </xsl:element>     </xsl:template>-->  <xsl:template match="AnswerSet/Answer" mode="Regionlist">    <xsl:variable name="next" select="following-sibling::Answer[1][@RegionName = current()/@RegionName and @RepeatRegion = current()/@RepeatRegion]"/>    <xsl:if test="$next">	  <xsl:element name="{($next)[1]/@questionId}">	    <xsl:if test="($next)[1]/@type = 'list'">		  <Items>		    <xsl:value-of select="($next)[1]/node()[1]"/>		  </Items>	    </xsl:if>	    <xsl:if test="not(($next)[1]/@type = 'list')">		  <xsl:value-of select="($next)[1]/node()[1]"/>	    </xsl:if>	  </xsl:element>	  <xsl:apply-templates select="$next" mode="Regionlist"/>    </xsl:if>    </xsl:template>   <xsl:template match="AnswerSet/Answer[@type = 'list' and not(@RegionName)]">    <xsl:element name="{@questionId}">	  <Items>	    <xsl:value-of select="."/>	  </Items>	  <xsl:apply-templates select="." mode="list"/>    </xsl:element>    <xsl:apply-templates select="following-sibling::Answer[not(@questionId = current()/@questionId) and not(@RegionName)][1]"/>  </xsl:template>  <xsl:template match="AnswerSet/Answer" mode="list">    <xsl:variable name="next" select="following-sibling::Answer[1][@questionId = current()/@questionId]"/>    <xsl:if test="$next">	  <Items>	    <xsl:value-of select="$next"/>	  </Items>	  <xsl:apply-templates select="$next" mode="list"/>    </xsl:if>  </xsl:template></xsl:stylesheet>

When I apply above XSLT to sample XML it will transform like :

<?xml version="1.0" encoding="utf-8"?><Node>  <NodeID></NodeID>  <NodeType></NodeType>  <NodeTypeID></NodeTypeID>  <NodeVirtual></NodeVirtual>  <NodeName></NodeName>  <ParentID></ParentID>  <Name>testttttt123</Name>  <TesCal>1/26/2012 12:00:00 AM</TesCal>  <testPhoto>Node1216sadi20120113.JPG</testPhoto>  <Sam>    <Testrr>rr111</Testrr>    <Testrr1>123456</Testrr1>  </Sam>  <Sam>    <Testrr>rr1112</Testrr>    <Testrr1>456789</Testrr1>  </Sam>  <Sam>    <Testrr>rr1113</Testrr>    <Testrr1>4577855</Testrr1>  </Sam>  <Sam>    <Testrr></Testrr>    <Testrr1></Testrr1>  </Sam>  <Sam>    <Testrr></Testrr>    <Testrr1></Testrr1>  </Sam>  <testPhoto12>Node1216sadi20120113.JPG</testPhoto12>  <testPhoto12>Node1216sadi20120113.JPG</testPhoto12>  <testPhoto12>Node1216sadi20120113.JPG</testPhoto12>  <testPhoto12>Node1216sadi20120113.JPG</testPhoto12>  <testPhoto12>Node1216sadi20120113.JPG</testPhoto12></Node>

the proble is last node testPhoto12 is generated multiple time but it should be one time only because Questionid="TextPhoto12" is one time only in sample xml. Please can you provice better idea how to generate XSLT properly. Thanks in advance.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...