XSLT在xsl:value-of上因未知原因而失败

时间:2010-09-27 14:38:50

标签: xml xslt

我一直在尝试创建一个xslt模板,但它会一直无声地失败,就好像发生了异常但没有被捕获一样。没有写出结束括号,使输出无效;

XML文件

<?xml version="1.0"?>
<gallery>
    <item>
        <file>IMAGEHEADER1.jpg</file>
        <thelink>michaeljackson123.htm</thelink>
    </item>
    <item>
        <file>IMAGEHEADER2.jpg</file>
        <thelink>barrywhite456.htm</thelink>
    </item>
</gallery>

XSLT文件

    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <tr>
                        <xsl:apply-templates />
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="gallery">
        <xsl:for-each select="item">
            <xsl:value-of select="position()"/>
            <xsl:choose>
                <xsl:when test="position() = 1">
                    <td rowspan="2" height="122" width="510">
                        <xsl:apply-templates select="." />
                    </td>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="item">
        <a style="display:block;width:520px;height:330px" id="categorylink">
            <xsl:attribute name="href">
                <xsl:value-of select="thelink"/>
            </xsl:attribute>
            <xsl:apply-templates select="file" />
        </a>
    </xsl:template>
    <xsl:template match="file">
        <img alt="">
            <xsl:attribute name="src">
                <xsl:value-of select="."/>
            </xsl:attribute>
        </img>
    </xsl:template>
</xsl:stylesheet>

输出无效,缺少关闭标签。

<html>
<body>
<tr>1<td rowspan="2" height="122" width="510"><a style="display:block;width:520px;height:330px" id="categorylink" href="michaeljackson123.htm"><img alt="" src="IMAGEHEADER1.jpg"></a></td>2</tr>
</body>
</html>

我的预期输出是;

<html>
    <body>
        <table>
            <tr>1
                <td rowspan="2" height="122" width="510">
                    <a style="display:block;width:520px;height:330px" id="categorylink" href="michaeljackson123.htm">
                        <img alt="" src="IMAGEHEADER1.jpg"></img>
                    </a>
                </td>2
            </tr>
        </table>
    </body>
</html>

请帮忙,看不清楚为什么会失败。

3 个答案:

答案 0 :(得分:2)

如果我不得不冒险猜测,我会说尝试添加:

<xsl:output method="xml"/>

我认为正在发生的事情是你的序列化方法处于自动模式,当它看到默认(不是xhtml)命名空间中的html元素时,它默认为html序列化,其中不需要关闭空标记。

答案 1 :(得分:1)

您如何查看输出? HTML中不需要img元素上的结束标记,因此如果您在Web浏览器中查看它,很多时候浏览器将显示与其文字输入略有不同的内容。我至少用firebug / chrome调试器注意到了这一点。

答案 2 :(得分:1)

这是因为HTML和XML序列化之间存在差异:

您的样式表默认为HTML序列化,因为您的根元素是html。在这种情况下,所有DTD声明的空元素都按照它的方式输出:

<img alt="" src="IMAGEHEADER1.jpg">

如果您想要XML序列化,则应声明:

<xsl:output method="xml"/>

然后你的输出将是:

<html>
    <body>
        <table>
            <tr>1
                <td rowspan="2" height="122" width="510">
                    <a style="display:block;width:520px;height:330px" id="categorylink" href="michaeljackson123.htm">
                        <img alt="" src="IMAGEHEADER1.jpg" />
                    </a>
                </td>2
            </tr>
        </table>
    </body>
</html>