即使没有元素匹配,xsl也会生成输出

时间:2018-04-19 00:00:57

标签: xml xslt

即使没有输入元素满足条件,转换xml文件的xsl也会生成输出。 xsl文件如下所示

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>
    <xsl:template match="Root/Order">
        <xsl:choose>
            <xsl:when test="Order1/task or Order2/task or task">
                <xsl:value-of select="ID"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/custId"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/System"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Status"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Indi"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Code"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="tasks/lno"/><xsl:text>|</xsl:text>
                <xsl:value-of select="tasks/val"/><xsl:text>&#xa;</xsl:text>
            </xsl:when>
            <xsl:otherwise></xsl:otherwise>
        </xsl:choose>
        <xsl:for-each select="task">
                <xsl:value-of select="ID"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/custId"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/System"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Status"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Indi"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Code"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="tasks/lno"/><xsl:text>|</xsl:text>
                <xsl:value-of select="tasks/val"/><xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
        <xsl:for-each select="Order1">
            <xsl:for-each select="task">
                <xsl:value-of select="ID"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/custId"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/System"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Status"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Indi"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Code"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="tasks/lno"/><xsl:text>|</xsl:text>
                <xsl:value-of select="tasks/val"/><xsl:text>&#xa;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
        <xsl:for-each select="Order2">
            <xsl:for-each select="task">
                <xsl:value-of select="ID"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/custId"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/System"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="cust/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Number"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Status"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Indi"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="make/Code"/><xsl:text>|</xsl:text> 
                <xsl:value-of select="tasks/lno"/><xsl:text>|</xsl:text>
                <xsl:value-of select="tasks/val"/><xsl:text>&#xa;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输入xml文件如下。

<cust>
        <Date>2018-04-16</Date>
        <name>abc</name>
        <code>xyz10</code>
        <custId>abc123</custId>
        <System>main</System>
        <Number>TANK</Number>
    </cust>

我的理解是,由于cust与定义的模板匹配不匹配,或者在条件时,不应该有输出。但是当我这样做时,转换输出如下所示。

2018-04-16
abc
xyz10
abc123
main
TANK

我相信由于输入没有定义的模板规则,因此在处理过程中调用内置模板规则并生成输出。我不确定这是否是正确的理由。请求你的答案。提前致谢。

1 个答案:

答案 0 :(得分:2)

添加此模板:

<xsl:template match="/">
    <xsl:apply-templates select="Root"/>
</xsl:template>

如果对上面的输入XML文件运行,则不会输出。