在使用XSLT进行排序时,省略XML树的某些部分

时间:2016-02-19 16:50:54

标签: xml sorting xslt

我正在使用以下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来实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

样式表中有两个模板,一个只复制上下文节点,另一个复制上下文节点并对其子元素进行排序。

要从排序机制中排除某些元素,您需要将它们排除在第二个模板处理之外。可能的(快速入侵)解决方案是添加另一个模板以匹配Handling及其所有后代并执行正常复制:

<xsl:template match="Handling|Handling//*" priority="2">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>