xml – 使用XSL从一个节点移动到另一个节点
发布时间:2020-12-16 23:10:49 所属栏目:百科 来源:网络整理
导读:所以我想使用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 da
所以我想使用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”生成结果文档的第二部分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |