基于元素值列表删除节点

时间:2018-02-02 15:03:43

标签: xslt-3.0

给出一个数字列表,如下所示,

我需要删除所有具有这些确切值的记录作为YEAR元素:

1982
1988

输入:

<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>19825</YEAR>
    </CD>
    <CD>
        <TITLE>Hide your heart</TITLE>
        <ARTIST>Bonnie Tyler</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>CBS Records</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>
    <CD>
        <TITLE>Greatest Hits</TITLE>
        <ARTIST>Dolly Parton</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>RCA</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1982</YEAR>
    </CD>
</CATALOG>

输出:

<CATALOG>
    <CD>
        <TITLE>Empire Burlesque</TITLE>
        <ARTIST>Bob Dylan</ARTIST>
        <COUNTRY>USA</COUNTRY>
        <COMPANY>Columbia</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>19825</YEAR>
    </CD>
    </CATALOG>

我怎样才能实现这一点,使用xslt 3?

具有确切的值我的意思是,如果错误地记录了一年的错误,那么这条记录将不会被删除,因为我会寻找“1982”

到目前为止,我一直在使用xmlstarlet

1 个答案:

答案 0 :(得分:0)

在XSLT 2和XSLT 3中,您可以定义一个带有一系列年份值的参数,以与YEAR元素的CD元素进行比较,并确保它们不会被进一步处理为空匹配它们的模板。然后,身份转换将在XSLT 3中使用适当的xsl:mode声明来处理其余部分:

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

  <xsl:param name="years-to-delete" select="1982, 1988"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="CD[YEAR = $years-to-delete]"/>

</xsl:stylesheet>

http://xsltfiddle.liberty-development.net/b4GWVa