用于删除元素的XSLT模板(如果它不包含特定的子元素

时间:2017-02-21 21:54:15

标签: xml xslt

我几乎是XML的新手,我需要一些帮助来创建一个XSLT模板,如果它没有填充元素,则不显示元素:

我将尝试用一些示例输入和所需的输出描述我的意思:

输入:

<shop>
    <item>
        <ID>12344</ID>
        <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK>
        <CDKNAMEDK>English CD name</CDKNAMEDK>
        <info>
            <Attributes>
                <authcode>DS2978</authcode>
                <PRICE>
                    <CURRENCY>DKK</CURRENCY>
                    <SALESPRICE>296</SALESPRICE>
                </PRICE>
                <Condition>used</Condition>
                <garanty>Yes</garanty>
                <garanty_length>2 months</garanty_length>
                <Label_name>demo</Label_name>
            </Attributes>
        </info>
    </item>
    <item>
        <ID>12345</ID>
        <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK>
        <CDKNAMEDK>English CD name</CDKNAMEDK>
    </item>
</shop>

期望输出:

<shop>  
    <item>
        <ID>12344</ID>
        <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK>
        <CDKNAMEDK>English CD name</CDKNAMEDK>
        <info>
            <Attributes>
                <authcode>DS29783</authcode>
                <PRICE>
                    <CURRENCY>DKK</CURRENCY>
                    <SALESPRICE>296</SALESPRICE>
                </PRICE>
                <Condition>used</Condition>
                <garanty>Yes</garanty>
                <garanty_length>2 months</garanty_length>
                <Label_name>demo</Label_name>
            </Attributes>
        </info>
    </item>
</shop>

所以,基本上,如果没有填充<info>元素,那么它应该隐藏整个<item>元素。

我希望那里有人愿意就如何实现这一点向我们提出建议。谢谢

1 个答案:

答案 0 :(得分:1)

这个简单的XSLT-1.0模板应该这样做:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*" />

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

    <!-- This template does remove the 'item' elements which do not have 'info' children -->
    <xsl:template match="item[not(info)]" />

</xsl:stylesheet>

此XSLT仅对所有节点应用identity template,并忽略没有item个孩子的所有info个节点。
<xsl:strip-space...删除被忽略元素的空白区域。