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
Post a Comment