yoS*_*yoS 5 xml xslt xpath dom
所以我想使用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>
Run Code Online (Sandbox Code Playgroud)
对此
<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>
Run Code Online (Sandbox Code Playgroud)
基本上我想采用关卡属性并使它们成为自己的东西.如果有某种方法可以删除级别编号并使用节点的顺序代替它,那将是一个巨大的好处.
这是解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<!-- attribute suppression template -->
<xsl:template match="@*" priority="2"/>
<xsl:template match="/doc">
<xsl:copy>
<xsl:apply-templates select="*" mode="data"/>
<levels>
<xsl:apply-templates select="*" mode="levels">
<xsl:sort select="@level" data-type="number"/>
</xsl:apply-templates>
</levels>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="data">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="data"/>
</xsl:copy></xsl:template><!-- identity template -->
<xsl:template match="@*" mode="data"/><!-- suppress -->
<xsl:template match="@id" mode="data" priority="2"><!-- keep -->
<xsl:copy-of select="."/></xsl:template>
<xsl:template match="@*|node()" mode="levels">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="levels"/>
</xsl:copy></xsl:template><!-- identity template -->
<xsl:template match="data" mode="levels">
<level>
<xsl:apply-templates select="@*" mode="levels"/>
</level></xsl:template>
<xsl:template match="@level" mode="levels"/><!-- suppress -->
<xsl:template match="@leveltype" mode="levels"><!-- rename -->
<xsl:attribute name="type"><xsl:value-of select="."/>
</xsl:attribute></xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
我假设您的预期输出是复制/粘贴人工制品,因为输入中<level id="cost" include="false" type="number"/>
缺少该属性。level[@id="cost"]