我需要根据一组规则从以下XML输入文件中删除特定的XML元素:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<NodeX>
<Value key="A">0815</Value>
<Value key="B">XYZ</Value>
<Value key="C">12345</Value>
<Value key="D">ABC</Value>
</NodeX>
<Description>
<section01>
<subsection key="KeyA">Some text</subsection>
<subsection key="KeyB">Some text</subsection>
</section01>
<section02>
<subsection key="KeyC">Some text</subsection>
</section02>
<section03>
<subsection key="KeyD">Some Text</subsection>
</section03>
</Description>
</root>
问题是这些规则有例外。
示例:在上面看到的形式的XML输入文件中,以下2个元素,其中key =&#34; KeyA&#34;和key =&#34; KeyB&#34;如果元素值使用属性键=&#34; A&#34;则必须删除包含&#34; 0815&#34;:
<subsection key="KeyA">Some text</subsection>
<subsection key="KeyB">Some text</subsection>
UNLESS:具有属性键=&#34; B&#34;的值元素包含&#34; XYZ&#34; AND Value元素,带属性key =&#34; C&#34;包含&#34; 12345&#34; AND值元素,带属性键=&#34; D&#34;包含&#34; ABC&#34;
因此在上面的情况下,不会删除任何XML元素,而是删除以下输入文件......
<?xml version="1.0" encoding="UTF-8"?>
<root>
<NodeX>
<Value key="A">0815</Value>
<Value key="B">XYZ</Value>
<Value key="C">23456</Value>
<Value key="D">DEF</Value>
</NodeX>
<Description>
<section01>
<subsection key="KeyA">Some text</subsection>
<subsection key="KeyB">Some text</subsection>
</section01>
<section02>
<subsection key="KeyC">Some text</subsection>
</section02>
<section03>
<subsection key="KeyD">Some Text</subsection>
</section03>
</Description>
</root>
将转换为以下输出文件:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<NodeX>
<Value key="A">0815</Value>
<Value key="B">XYZ</Value>
<Value key="C">23456</Value>
<Value key="D">DEF</Value>
</NodeX>
<Description>
<section02>
<subsection key="KeyC">Some text</subsection>
</section02>
<section03>
<subsection key="KeyD">Some Text</subsection>
</section03>
</Description>
</root>
由于具有属性key =&#34; C&#34;的值元素的内容,将删除具有父section01元素的两个子节元素。和键=&#34; D&#34;。
如下所示,XML表现形式是XSL正在处理的规则的合适表示,如我之前的一个问题所述:(Rule-based restructuring of nodes)?
<?xml version="1.0" encoding="UTF-8"?>
<rules>
<prod code="0815">
<keys>
<key>keyA</key>
<key>keyB</key>
</keys>
<exceptions>
<Value key="B">XYZ</Value>
<Value key="C">12345</Value>
<Value key="D">ABC</Value>
</exceptions>
</prod>
<prod code="0815">
<keys>
<key>keyD</key>
</keys>
<exceptions>
<Value key="E">ZZZ</Value>
</exceptions>
</prod>
</rules>
如何根据此规则自动创建条件测试&#34;规则&#34;在XML文件中?
例外可以包含任意数量的Value元素条目。
从XML规则生成XSLT是一种合适的方法吗?
答案 0 :(得分:0)
要使用XSLT“删除”元素,请从Identity Transform(复制所有内容)开始
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
然后添加一个或多个与您要删除的内容相匹配的模板。如果要删除整个子树,那些模板应该不输出任何内容;如果要丢弃节点但保留其所有子节点,则这些模板应执行<xsl:apply-templates select='node()'/>