所以我想使用XSL转换以下内容 doc data id="priority" level="2" include="true" namePriority/name /data data id="cost" level="1" leveltype="number" nameCost/name /data data id="date" level="3" include="true" nameDate/name /data/doc 对
<doc> <data id="priority" level="2" include="true"> <name>Priority</name> </data> <data id="cost" level="1" leveltype="number"> <name>Cost</name> </data> <data id="date" level="3" include="true"> <name>Date</name> </data> </doc>
对此
<doc> <data id="priority"> <name>Priority</name> </data> <data id="cost"> <name>Cost</name> </data> <data id="date"> <name>Date</name> </data> <!-- ordering matters, though if necessary I can reorder this manually via the DOM instead of XSL --> <levels> <level id="cost" include="false" type="number"/> <level id="priority" include="true"/> <level id="date" include="true"/> </level> </doc>
基本上我想采用关卡属性并使它们成为自己的东西.如果有某种方法可以删除级别编号并使用节点的顺序代替它,那将是一个巨大的好处.
这是一个更短,更简单的解决方案,仅使用模板(没有< xsl:for-each>):<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="/*"> <doc> <xsl:apply-templates select="*"/> <levels> <xsl:apply-templates select="data" mode="level"> <xsl:sort select="@level" data-type="number"/> </xsl:apply-templates> </levels> </doc> </xsl:template> <xsl:template match="data/@*[not(name()='id')]"/> <xsl:template match="data" mode="level"> <level id="{@id}" include="{boolean(@include)}"> <xsl:if test="@leveltype"> <xsl:attribute name="type"><xsl:value-of select="@leveltype"/></xsl:attribute> </xsl:if> </level> </xsl:template> </xsl:stylesheet>
应用于提供的XML文档时:
<doc> <data id="priority" level="2" include="true"> <name>Priority</name> </data> <data id="cost" level="1" leveltype="number"> <name>Cost</name> </data> <data id="date" level="3" include="true"> <name>Date</name> </data> </doc>
产生了想要的正确结果:
<doc> <data id="priority"> <name>Priority</name> </data> <data id="cost"> <name>Cost</name> </data> <data id="date"> <name>Date</name> </data> <levels> <level id="cost" include="false" type="number"/> <level id="priority" include="true"/> <level id="date" include="true"/> </levels> </doc>
说明:
>使用和覆盖身份规则/模板.>使用mode =“level”生成结果文档的第二部分.