如何使用带有样式表和 xsltproc 的 xslt 从 xml 中删除元素?

Posted

技术标签:

【中文标题】如何使用带有样式表和 xsltproc 的 xslt 从 xml 中删除元素?【英文标题】:How to remove elements from xml using xslt with stylesheet and xsltproc? 【发布时间】:2010-09-24 05:24:54 【问题描述】:

我有很多具有以下形式的 XML 文件:

<Element fruit="apple" animal="cat" />

我想从文件中删除。

使用 XSLT 样式表和 Linux 命令行实用程序 xsltproc,我该怎么做?

到此为止,我已经在脚本中获得了包含我要删除的元素的文件列表,因此可以将单个文件用作参数。


编辑:这个问题最初缺乏意图。

我想要实现的是删除整个元素“元素” where (fruit=="apple" && animal=="cat")。在同一个文档中有许多名为“元素”的元素,我希望这些元素能够保留。所以

<Element fruit="orange" animal="dog" />
<Element fruit="apple"  animal="cat" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

会变成:

<Element fruit="orange" animal="dog" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

【问题讨论】:

【参考方案1】:

使用最基本的 XSLT 设计模式之一:“覆盖identity transformation”只需编写以下内容:

【讨论】:

尽管我什至没有问正确的问题,但你已经回答了我应该问的问题! :) 那你为什么不把这篇文章标记为正确答案呢?然后它会从未解决的问题列表中消失。 不得不等到我验证它有效,并且今天没有机会工作。不过现在完成了,谢谢 Dimitre。 你能告诉我这个xpath表达式/bookstore/book[position() = 1 or position() = 3]/@*的缩写版本是什么吗? @Babai, /*/book[position() = 1 or position() = 3]/@* 。在 XPath 2.0 中:/*/book[position() = (1,3)]/@*【参考方案2】:

@Dimitre Novatchev 的答案当然既正确又优雅,但有一个概括(OP 没有询问):如果您要过滤的元素也有您想要的子元素或文本怎么办 保留?

我相信这个微小的变化涵盖了这种情况:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">

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

    <!-- drop DropMe elements, keeping child text and elements -->
    <xsl:template match="DropMe">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

指定其他属性等的匹配条件可能很复杂,如果您要删除其他内容,则可以使用多个此类模板。

所以这个输入:

<?xml version="1.0" encoding="UTF-8"?>
<mydocument>
    <p>Here's text to keep</p>
    <p><DropMe>Keep this text but not the element</DropMe>; and keep what follows.</p>
    <p><DropMe>Also keep this text and <b>this child element</b> too</DropMe>, along with what follows.</p>
</mydocument>

产生这个输出:

<?xml version="1.0" encoding="UTF-8"?><mydocument>
    <p>Here's text to keep</p>
    <p>Keep this text but not the element; and keep what follows.</p>
    <p>Also keep this text and <b>this child element</b> too, along with what follows.</p>
</mydocument>

归功于XSLT Cookbook。

【讨论】:

以上是关于如何使用带有样式表和 xsltproc 的 xslt 从 xml 中删除元素?的主要内容,如果未能解决你的问题,请参考以下文章

带有文本输出的 XSLT 空白控件

带有 Quartz 作业的 XSL 样式表路径

xsl 在带有样式表的 Multiple 的 xml 文档上创建

如何在使用 FOP 的 XSL-FO 中保留带有标题的表格但允许在表格主体内分页符

有没有一种简单的方法来表示 xsl 样式表中的引号?

如何使用 XSL 生成 HTML 文件?