XSL无法使用模板匹配

时间:2016-05-25 19:44:28

标签: xml xslt

我第一次尝试xsl,并且在3小时内无法打印一行!

顺便说一句。 最简单的xml文件:

 <?xml version="1.0" encoding="UTF-8"?>

<book>
    <author>qqqqqq</author>
    <title>Srwrtwt</title>
    <title>yoo</title>
    <price>$10.00</price>
</book>

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="html"/>

    <xsl:template match="author">
        <html>

        </html>
    </xsl:template>

    <xsl:template match="title">
            <h1>
            <xsl:apply-templates/>
            </h1>   
    </xsl:template>

</xsl:stylesheet>

输出结果为:

    <html></html>
    <h1>Srwrtwt</h1>
    <h1>yoo</h1>
    $10.00

我很好,但是如果我像这样改变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="html"/>

    <xsl:template match="/">
        <html>

        </html>
    </xsl:template>

    <xsl:template match="title">
            <h1>
            <xsl:apply-templates/>
            </h1>   
    </xsl:template>

</xsl:stylesheet>

这是输出,为什么模板匹配=“标题”现在不起作用?:

<html></html>

事实是我做了类似的例子试图理解为什么会发生这种情况,而在其他情况下它可以工作: 例如:

<?xml version="1.0"?>
<page>
    <title>Hello World</title>
    <content>
        <x>dewjnf</x>
        <paragraph>
            <resume>This is my first page!</resume>
        </paragraph>
    </content>
</page> 

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="html" />
    <xsl:template match="/">
        <html>
            <head>
                <title>
                    <xsl:value-of select="page/title" />
                </title>
                <style>
                    h1{
                    color: blue;
                    font-style: italic;
                    }
                </style>
            </head>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <div align="center">
            <h1>
                <xsl:value-of select="." />
            </h1>
        </div>
    </xsl:template>
    <xsl:template match="resume">
        <p>
            <xsl:apply-templates />
        </p>
    </xsl:template>
</xsl:stylesheet>

输出正是我对模板匹配工作的预期: 对我而言,似乎与前一个示例完全相同,但行为不同。

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World</title>
<style>
h1 {
    color: blue;
    font-style: italic;
}
</style>
</head>
<body>

    <div align="center">
        <h1>Hello World</h1>
    </div>

    dewjnf

    <p>This is my first page!</p>



</body>
</html>

问题是为什么有时候匹配=“/”其他匹配不起作用,有时是的?错误在哪里?

2 个答案:

答案 0 :(得分:1)

为什么标题模板在第二个示例中不起作用?因为没有达到。您应该在<xsl:apply-templates/>内执行<xsl:template match="/"/><html>... - 它不会自行递归

答案 1 :(得分:0)

如果您想要添加更多匹配项,则需要添加

<xsl:apply-templates />

templates中。如果您不这样做,则不会考虑子节点。