所以我想使用XSL转换以下内容
<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”生成结果文档的第二部分.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。