Creation of dynamic nested elements from a flat structure
What is the most elegant way of creation of:
- A flat structure from the source sample XML
- Dynamic creation of element names based on a value in the source node
Sample XML:
<block4>
<tag>
<name>16R</name>
<value>GENL</value>
</tag>
<tag>
<name>23G</name>
<value>REPL</value>
</tag>
<tag>
<name>16S</name>
<value>GENL</value>
</tag>
<tag>
<name>16R&开发者_C百科lt;/name>
<value>USECU</value>
</tag>
<tag>
<name>16R</name>
<value>FIA</value>
</tag>
<tag>
<name>94B</name>
<value>:PLIS//EXCH/XTSE</value>
</tag>
<tag>
<name>16S</name>
<value>FIA</value>
</tag>
<tag>
<name>16S</name>
<value>USECU</value>
</tag>
<tag>
<name>16R</name>
<value>CADETL</value>
</tag>
<tag>
<name>98A</name>
<value>:XDTE//20110128</value>
</tag>
<tag>
<name>16S</name>
<value>CADETL</value>
</tag>
</block4>
My desired output is:
<block4>
<GENL>
<tag>
<name>23G</name>
<value>REPL</value>
</tag>
</GENL>
<USECU>
<FIA>
<tag>
<name>94B</name>
<value>:PLIS//EXCH/XTSE</value>
</tag>
</FIA>
</USECU>
<CADETL>
<tag>
<name>98A</name>
<value>:XDTE//20110128</value>
</tag>
</CADETL>
</block4>
This stylesheet:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()[1]|@*"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="tag[name='16R']">
<xsl:element name="{value}">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:element>
<xsl:apply-templates select="following-sibling::tag
[name='16S']
[value=current()/value]
[1]/following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="tag[name='16S']"/>
</xsl:stylesheet>
Output:
<block4>
<GENL>
<tag>
<name>23G</name>
<value>REPL</value>
</tag>
</GENL>
<USECU>
<FIA>
<tag>
<name>94B</name>
<value>:PLIS//EXCH/XTSE</value>
</tag>
</FIA>
</USECU>
<CADETL>
<tag>
<name>98A</name>
<value>:XDTE//20110128</value>
</tag>
</CADETL>
</block4>
Note: Fine grained traversal.
精彩评论