XSLT未按预期显示

时间:2014-01-04 18:46:45

标签: xml xslt

我不确定是什么问题,或者我的XSLT文件中缺少什么,结果没有按预期显示,其中<html></html>以外的所有代码都没有出现!

我也尝试从xsl:output method="html"切换到xsl:output method="xml",它也不起作用。结果只显示BOOKS STORE,下面没有其他内容。

请帮帮忙。谢谢!

这是XSLT文件

<?xml version="1.0" encoding="utf-8"?><!-- DWXMLSource="books1.xml" -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>


<xsl:template match="/">
    <html>
    <body bgcolor="#fff">
    <h1>BOOKS STORE </h1>

    </body>

    </html>
</xsl:template>

<xsl:template match="ITEM">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="ITEM">
    <h3><xsl:value-of select="title"/></h3>
    <xsl:apply-templates/>
</xsl:template>


</xsl:template>

</xsl:stylesheet>

这是XML文件

<?xml version="1.0" encoding="utf-8"?>
<BOOKS>
      <ITEM CAT="MMP">
         <TITLE>Pride and Prejudice</TITLE>
         <AUTHOR>Jane Austen</AUTHOR>
         <PUBLISHER>Modern Library</PUBLISHER>
         <PUB-DATE>2002-12-31</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>9</PRICE>

      </ITEM>
      <ITEM CAT="P">
         <TITLE>Wuthering Heights</TITLE>
         <AUTHOR>Charlotte Brontë</AUTHOR>
         <PUBLISHER>Penguin Classics</PUBLISHER>
         <PUB-DATE>2002-12-31</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>9.040000000000001</PRICE>

      </ITEM>
      <ITEM CAT="P">
         <TITLE>Tess of the d'Urbervilles</TITLE>
         <AUTHOR>Thomas Hardy</AUTHOR>
         <PUBLISHER>Bantam Classics</PUBLISHER>
         <PUB-DATE>1984-05-01</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>12.5</PRICE>

      </ITEM>
      <ITEM CAT="P">
         <TITLE>Jude the Obscure</TITLE>
         <AUTHOR>Thomas Hardy</AUTHOR>
         <PUBLISHER>Penguin Classics</PUBLISHER>
         <PUB-DATE>1998-09-01</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>7</PRICE>

      </ITEM>
      <ITEM CAT="H">
         <TITLE>The Big Over Easy</TITLE>
         <AUTHOR>Jasper Fforde</AUTHOR>
         <PUBLISHER>Hodder &amp; Stoughton</PUBLISHER>
         <PUB-DATE>2005-07-11</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>14.55</PRICE>

      </ITEM>
      <ITEM CAT="P">
         <TITLE>The Eyre Affair</TITLE>
         <AUTHOR>Jasper Fforde</AUTHOR>
         <PUBLISHER>Penguin</PUBLISHER>
         <PUB-DATE>2003-02-25</PUB-DATE>
         <LANGUAGE>English</LANGUAGE>
         <PRICE>15</PRICE>

      </ITEM>
   </BOOKS>

2 个答案:

答案 0 :(得分:1)

您没有获得任何额外输出的原因是您在此模板中没有xsl:apply-templates

<xsl:template match="/">
    <html>
    <body bgcolor="#fff">
    <h1>BOOKS STORE </h1>

    </body>

    </html>
</xsl:template>

添加如下:

<xsl:template match="/">
    <html>
      <body bgcolor="#fff">
        <h1>BOOKS STORE </h1>
        <xsl:apply-templates/>
      </body>
    </html>
</xsl:template>

您还有一个额外的</xsl:template>

另一件事是你有ITEM模糊的模板匹配。你只需要使用一个。

您的样式表应如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

    <xsl:template match="/">
        <html>
            <body bgcolor="#fff">
                <h1>BOOKS STORE </h1>
                <xsl:apply-templates/>
            </body>         
        </html>
    </xsl:template>

    <xsl:template match="ITEM">
        <h3><xsl:value-of select="TITLE"/></h3>
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

请注意,由于您要匹配ITEM然后执行xsl:apply-templates,因此您将获得重复的标题输出。由于XSLT built-in rules,您还将从ITEM中获取所有其他元素的文本。

这至少应该让你开始。如果有任何问题,请提出更多问题。

答案 1 :(得分:0)

也许如果您可以显示所需的输出XML,那将非常有用。

我在这里做了一个非常疯狂的猜测。你想列出“BOOKS STORE”下面的所有“TITLE”吗?

在这种情况下,您可以尝试

<xsl:template match="/">
    <html>
        <body bgcolor="#fff">
            <h1>BOOKS STORE </h1>
            <xsl:for-each select="//ITEM/TITLE">
                <TITLE><xsl:value-of select="."/></TITLE>
            </xsl:for-each>
            <xsl:apply-templates/>
        </body>         
    </html>
</xsl:template>