我想从一个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(...).. ?>这样的东西。
发布于 2013-05-17 02:16:41
这是因为您的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输出(使用XSLT作为输入(或任何文件))
<html><?test pi></html>要强制使用XML pi,请添加xsl:output
<xsl:output indent="yes" method="xml"/>发布于 2013-05-17 01:16:28
我的理解是,HTML中处理指令的正确表示是(或者曾经是)省略问号,而XSLT序列化规范规定HTML输出方法应该这样做。对不起,我现在没有时间查阅规格书来确认这一点。
当然,您正在尝试生成在PHP规范而不是HTML规范中定义的东西,而XSLT序列化规范对PHP一无所知。
https://stackoverflow.com/questions/16592110
复制相似问题