最优雅的创作方式是什么:
示例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</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>
我想要的输出是:
<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>
答案 0 :(得分:1)
此样式表:
<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>
输出:
<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>
注意:细粒度遍历。