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

Popular posts from this blog

ios - iPhone/iPad different view orientations in different views , and apple approval process -

java Extracting Zip file -

C# WinForm - loading screen -