初始标记不存在时XSLT转换失败

初始标记不存在时XSLT转换失败,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,输入XML <web-inf> <servlet> <servlet-name>S1</servlet-name> <servlet-class>XXXX</servlet-class> </servlet> <servlet> <servlet-name>S2</servlet-name> <servlet-class>YYYY&

输入XML

<web-inf>
<servlet>
    <servlet-name>S1</servlet-name>
    <servlet-class>XXXX</servlet-class>
</servlet>

<servlet>
    <servlet-name>S2</servlet-name>
    <servlet-class>YYYY</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>S1</servlet-name>
    <url-pattern>*.xsp</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>S2</servlet-name>
    <url-pattern>*.xsp</url-pattern>
</servlet-mapping>
</web-inf>
我想添加以下内容,即使标签不存在。如果标签以标签作为值存在,那么我不想做任何事情。我正在使用下面的转换,但当标签根本不存在时,它就不起作用了。有什么建议吗

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

<xsl:template match="web-inf[not (zoom/boom='WHAT')]/zoom[last()]">
        <xsl:copy-of select="."/>
        <zoom><boom>WHAT</boom></zoom>
</xsl:template>

尝试如下更改模板

<xsl:template match="web-inf[not(zoom/boom='WHAT')]">
    <xsl:copy>
        <zoom>
            <boom>WHAT</boom>
        </zoom>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

这将去掉web inf标记,并在末尾添加新标记。不完全是我想做的。我想在刚开始时添加新标记。您需要保留标识模板并添加此更新模板以添加所需元素。它将在最后添加。不能在开始时添加到标签下面吗?是的。我已经修改了解决方案。已将移动到元素之后。现在应该在元素下面添加。谢谢。这正是我想要的。