xml - XSLT: Return results based on following sibling value -
i'am new xslt. appreciated ....
<test> <loop loop_id="5" loopelementorder_no="1" segment_id="3" > <usage_id>1</usage_id> <value>41</value> </loop> <loop loop_id="5" loopelementorder_no="2" segment_id="3"> <usage_id>1</usage_id> <value>2</value> </loop> <loop loop_id="5" loopelementorder_no="4" segment_id="3"> <usage_id>2</usage_id> <value>raj</value> </loop> <loop loop_id="5" loopelementorder_no="5" segment_id="3"> <usage_id>3</usage_id> <value>d</value> </loop> <loop loop_id="5" loopelementorder_no="6" segment_id="3"> <usage_id>3</usage_id> <value>8</value> </loop> <loop loop_id="5" loopelementorder_no="7" segment_id="3"> <usage_id>3</usage_id> <value>7</value> </loop> <loop loop_id="5" loopelementorder_no="1" segment_id="4"> <usage_id>1</usage_id> <value>ic</value> </loop> <loop loop_id="5" loopelementorder_no="2" segment_id="4"> <usage_id>2</usage_id> <value>d</value> </loop> <loop loop_id="5" loopelementorder_no="3" segment_id="4"> <usage_id>3</usage_id> <value>dm</value> </loop> <loop loop_id="5" loopelementorder_no="4" segment_id="4"> <usage_id>2</usage_id> <value>wj</value> </loop> </test> i return 'value' if usage_id either 1 or 2. in case if usage_id 3 should return "n/a". however, example if in segment_id=3 loopelementorder_no=5 remaining of segment_id=3 doesn't contains usage_id 1 or 2 in case need return "^" , continue segment_id=4 loopelementorder_no=1.
the desired output above is:
41 2 raj ^ic d n/a wj
a shorter, simpler (only 3 templates, no xsl:apply-templates, no xsl:variable, no current() , no modes) , more understandable solution in "push style":
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="text"/> <xsl:template match="loop[not(usage_id >2)]"> <xsl:value-of select="concat(value, ' ')"/> </xsl:template> <xsl:template match= "loop[usage_id = 3 , preceding-sibling::loop[not(usage_id >2)][1]/@segment_id =following-sibling::loop[not(usage_id >2)][1]/@segment_id ] ">n/a </xsl:template> <xsl:template match= "loop [usage_id >2 , preceding-sibling::loop[1][not(usage_id >2)] , not(@segment_id =following-sibling::loop[not(usage_id >2)][1]/@segment_id) ]">^ </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet> when transformation applied on provided xml document:
<test> <loop loop_id="5" loopelementorder_no="1" segment_id="3" > <usage_id>1</usage_id> <value>41</value> </loop> <loop loop_id="5" loopelementorder_no="2" segment_id="3"> <usage_id>1</usage_id> <value>2</value> </loop> <loop loop_id="5" loopelementorder_no="4" segment_id="3"> <usage_id>2</usage_id> <value>raj</value> </loop> <loop loop_id="5" loopelementorder_no="5" segment_id="3"> <usage_id>3</usage_id> <value>d</value> </loop> <loop loop_id="5" loopelementorder_no="6" segment_id="3"> <usage_id>3</usage_id> <value>8</value> </loop> <loop loop_id="5" loopelementorder_no="7" segment_id="3"> <usage_id>3</usage_id> <value>7</value> </loop> <loop loop_id="5" loopelementorder_no="1" segment_id="4"> <usage_id>1</usage_id> <value>ic</value> </loop> <loop loop_id="5" loopelementorder_no="2" segment_id="4"> <usage_id>2</usage_id> <value>d</value> </loop> <loop loop_id="5" loopelementorder_no="3" segment_id="4"> <usage_id>3</usage_id> <value>dm</value> </loop> <loop loop_id="5" loopelementorder_no="4" segment_id="4"> <usage_id>2</usage_id> <value>wj</value> </loop> </test> the wanted, correct result produced:
41 2 raj ^ ic d n/a wj update:
the solution can shortened , simplified more:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="text"/> <xsl:template match="loop[not(usage_id >2)]"> <xsl:if test= "preceding-sibling::loop[not(usage_id >2)][1] [not(@segment_id = current()/@segment_id)]">^ </xsl:if> <xsl:value-of select="concat(value, ' ')"/> </xsl:template> <xsl:template match= "loop[usage_id = 3 , preceding-sibling::loop[not(usage_id >2)][1]/@segment_id =following-sibling::loop[not(usage_id >2)][1]/@segment_id ] ">n/a </xsl:template> <xsl:template match="text()"/> </xsl:stylesheet>
Comments
Post a Comment