XSLT Selecting specific sibling nodes between two nodes of xml -


suppose have following xml structure

<?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/xsl"?> <?xml-stylesheet type="text/xsl"?> <wtt> <msg      usertext="iswritable = true" > </msg> <test     baselvl="msg" > </test> <start    id = "1" > </start> <msg     usertext="iswritable = true" > </msg> <test     baselvl="msg"  > </test> <msg     usertext="writebuffers = 2"> </msg> <test     baselvl="txt" > </test> <msg     usertext="readbuffers = 1"> </msg> <end    id ="1" > </end>  <start    id = "2" > </start> <test    baselvl="sound" >  </test> <test     baselvl="msg" > </test> <msg     usertext="vertexbuffers = 1"> </msg> <end    id ="2" > </end> <msg     usertext="vertexbuffers = 1"> </msg> </wtt> 

output :

<start    id = "1" > </start> <msg     usertext="iswritable = true" > </msg> <msg     usertext="readbuffers = 1"> </msg> <end    id ="1"> </end> <start    id = "2" > </start> <msg     usertext="vertexbuffers = 1"> </msg> <end    id ="2" > </end>     

the structure of xml not fixed , tag can put anywhere. there way this? tried using foreach , selecting msg nodes cannot break foreach in xslt. have select <msg/> tags between <start/> , <end/> tags in separate groups.

the following stylesheet:

xslt 1.0

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>  <xsl:template match="/wtt">     <root>         <xsl:copy-of select="start | end | msg[preceding-sibling::start[1]/@id = following-sibling::end[1]/@id]"/>     </root> </xsl:template>  </xsl:stylesheet> 

when applied xml input, return:

<?xml version="1.0" encoding="utf-8"?> <root>    <start id="1"/>    <msg usertext="iswritable = true"/>    <msg usertext="writebuffers = 2"/>    <msg usertext="readbuffers = 1"/>    <end id="1"/>    <start id="2"/>    <msg usertext="vertexbuffers = 1"/>    <end id="2"/> </root> 

Comments