我有很多XML文件,有一些形式:
<Element fruit="apple" animal="cat" />
使用XSLT样式表和Linux命令行实用程序xsltproc,我该怎么做?
到这一点,在脚本中我已经有包含我想要删除的元素的文件列表,所以单个文件可以用作一个参数。
编辑:这个问题最初缺乏意图。
我想实现的是删除整个元素“Element”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" />
使用最基本的XSLT设计模式之一:“覆盖
identity transformation”将只写下列内容:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Element[@fruit='apple' and @animal='cat']"/> </xsl:stylesheet>
请注意第二个模板如何仅覆盖名为“元素”的元素的元素,该元素具有值为“apple”的属性“fruit”和值为“cat”的属性“animal”。此模板具有空主体,这意味着匹配的元素被简单地忽略(匹配时不产生任何内容)。
将此转换应用于以下源XML文档时:
<doc>... <Element name="same">foo</Element>... <Element fruit="apple" animal="cat" /> <Element fruit="pear" animal="cat" /> <Element name="same">baz</Element>... <Element name="same">foobar</Element>... </doc>
产生想要的结果:
<doc>... <Element name="same">foo</Element>... <Element fruit="pear" animal="cat"/> <Element name="same">baz</Element>... <Element name="same">foobar</Element>... </doc>