2

我想从 xml 文档的 xsl 转换创建一个带有 php 块的 html 文档(仅用于学习目的)。我正在使用<xsl:processing-instruction>标签。

<xsl:stylesheet version="1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <xsl:processing-instruction name="php">
    <xsl:text>
        setcookie("cookiename", "cookievalue");
        echo "";
    </xsl:text>
    </xsl:processing-instruction>
    <html>
        <head>
        <meta charset="utf-8" />
        </head>
        <body>
        <xsl:apply-templates />
        </body>
    </html>
    </xsl:template>
    <xsl:template match="pagina">
    <xsl:for-each select="paragraf">
    <p>
        <xsl:value-of select="."/>
    </p>
    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

结果是:

<?php 
        setcookie("ceva", "textceva");
        echo "";>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta charset="utf-8">
    </head>
    <body>
    <p>
        text 1
    </p>
    <p>
        text 2
    </p>
    </body>
</html>

为什么第二个问号不见了?我期待类似的东西<?php setcookie(...).. ?>

4

2 回答 2

2

这是因为您的 pi(处理指令)是 SGML 处理指令(HTML 是 SGML)。通常 XSLT 的默认输出是 XML,但是无论您使用的处理器必须默认为 HTML(或者您在 XSLT 示例中省略了某些内容)。指向这一点的另一个线索是您的meta元素在输出中没有关闭。

示例(注意method="html"):

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="html"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <xsl:processing-instruction name="test">pi</xsl:processing-instruction>
        </html>
    </xsl:template>

</xsl:stylesheet>

输出(使用 XSLT 作为输入(或任何 XML 文件))

<html><?test pi></html>

要强制使用 XML pi,请添加xsl:output

<xsl:output indent="yes" method="xml"/>
于 2013-05-16T18:16:40.817 回答
0

据我了解,HTML 中处理指令的正确表示是(或在相关时间点)省略问号,并且 XSLT 序列化规范说这是 HTML 输出方法应该做的. 抱歉,我现在没有时间查阅规格来确认这一点。

当然,您正在尝试生成在 PHP 规范而不是 HTML 规范中定义的东西,而 XSLT 序列化规范对 PHP 一无所知。

于 2013-05-16T17:16:27.627 回答