我正在使用以下XSLT
对大型XML文件进行排序<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[*]">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="local-name()"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:transform>
问题是,我想省略XML的某些子树。我不确定如何实现这一目标。例如,假设我的原始XML是
<Car>
<Handling>
<Suspension>
<Type>Coilover</Type>
<Brand>Ohlins</Brand>
</Suspension>
<Steering>
<Type>Electric</Type>
<Brand>Momo</Brand>
</Steering>
</Handling>
<Engine>
<Hybrid>
<Type>LiON</Type>
<Brand>Duracell</Brand>
</Hybrid>
<Combustion>
<Type>Rotary</Type>
<Brand>Mazda</Brand>
</Combustion>
</Engine>
</Car>
输出应如下所示。请注意,<Handling>
下的所有内容都未排序
<Car>
<Engine>
<Combustion>
<Brand>Mazda</Brand>
<Type>Rotary</Type>
</Combustion>
<Hybrid>
<Brand>Duracell</Brand>
<Type>LiON</Type>
</Hybrid>
</Engine>
<Handling>
<Suspension>
<Type>Coilover</Type>
<Brand>Ohlins</Brand>
</Suspension>
<Steering>
<Type>Electric</Type>
<Brand>Momo</Brand>
</Steering>
</Handling>
</Car>
知道如何通过修改XSLT来实现这一目标吗?
答案 0 :(得分:2)
样式表中有两个模板,一个只复制上下文节点,另一个复制上下文节点并对其子元素进行排序。
要从排序机制中排除某些元素,您需要将它们排除在第二个模板处理之外。可能的(快速入侵)解决方案是添加另一个模板以匹配Handling
及其所有后代并执行正常复制:
<xsl:template match="Handling|Handling//*" priority="2">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>