11
<events>
    <main>
        <action>modification</action>
        <subAction>weights</subAction>
    </main>
</events>
<SeriesSet>
    <Series id="Price_0">
        <seriesBodies>
            <SeriesBody>
                <DataSeriesBodyType>Do Not Copy</DataSeriesBodyType>
            </SeriesBody>
        </SeriesBodies>
    </Series>
</SeriesSet>

如何复制所有 xml 并排除 DataSeriesBodyType 元素

4

2 回答 2

24

您只需要使用身份模板(就像您使用的那样),然后使用与 DataSeriesBodyType 匹配的模板,它什么都不做。

代码将是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    <xsl:output method="xml" encoding="utf-8" indent="yes"/>

    <!-- Identity template : copy all text nodes, elements and attributes -->   
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- When matching DataSeriesBodyType: do nothing -->
    <xsl:template match="DataSeriesBodyType" />

</xsl:stylesheet>

如果要规范化输出以删除空数据文本节点,则将以下模板添加到先前的样式表中:

<xsl:template match="text()">
    <xsl:value-of select="normalize-space()" />
</xsl:template>
于 2013-02-20T17:13:23.520 回答
0

以下对我有用,因为有时我需要创建一个没有一个元素的树来创建一个变量,有时我需要删除另一个来创建另一个变量。请注意,主匹配不应匹配根元素“/”,因为如果这样做,它只会在仅处理一个根元素时复制整个三个。但请记住,我们对所有节点使用应用模板的这种解决方案会干扰您可能必须执行其他工作的其他模板,因此您需要使用“模式”选项来分隔它们。

    <xsl:template match="node()|@*">
       <xsl:copy>
         <xsl:apply-templates select="node()[not(self::DataSeriesBodyType)]|@*"/>
       </xsl:copy>
    </xsl:template>
于 2021-09-25T17:57:24.513 回答