根据具有逻辑条件的规则集删除XML元素

时间:2014-04-14 11:49:54

标签: xml xslt

我需要根据一组规则从以下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是一种合适的方法吗?

1 个答案:

答案 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()'/>