PHP Conference Japan 2024

XSL

添加注释

用户贡献注释 23 条注释

匿名
18 年前
回复 appletalk at gmail dot com
<snip>
正如你们许多人可能注意到的,如果存在“&nbsp;”实体,DOM 解析器会给出错误。E_WARN 消息如下所示
警告:DOMDocument::load() [function.load]:在...中未定义实体“nbsp”
有很多方法可以解决这个问题
.....
b) 定义 &nbsp;
在文档顶部,在<?xml?>定义之后,添加
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;" >
]>
.......</snip>
只想让大家知道选项 b 不起作用。我不确定为什么没有正确实现,但事实并非如此,所以不要浪费时间。不幸的是,DOMXSL 转换的能力远不如旧的 xslt 函数。
adrian at foeder dot de
18 年前
如果要在 XSL 样式表中使用 document() 函数,请注意必须在那里使用绝对路径。
对于 Windows 用户来说很重要:绝对路径*必须*使用正斜杠,因此在转换文档之前,请将 Windows 路径反斜杠替换为正斜杠。

示例
这将不起作用
<xsl:copy-of select="document('test.xml')" />

这也不起作用
<xsl:copy-of select="document('c:\temp\test.xml')" />

但这样可以工作
<xsl:copy-of select="document('c:/temp/test.xml')" />
rd at jerntorget dot se
20 年前
如果收到以下警告消息

xsltApplyOneTemplate:_if_ 未编译(例如,if 可以是 apply-template 或其他方法),我发现问题似乎是 <xsl:if> 之前的 &nbsp; 或导致问题的任何内容。

解决此问题的一种方法是在 &nbsp; 周围使用 span 标记,例如:<span>&nbsp;</span>
Jaroslaw Zabiello
13 年前
这更有用,不需要文件,它只是将 XML 和 XSL 字符串作为输入参数并返回转换后的 XML

<?php
/**
* @param $xml
* @param $xsl
* @return string xml
*/
function transform($xml, $xsl) {
$xslt = new XSLTProcessor();
$xslt->importStylesheet(new SimpleXMLElement($xsl));
return
$xslt->transformToXml(new SimpleXMLElement($xml));
}
?>
emilise dot victor at gmail dot com
16 年前
以下是如何在不使用<xml:message>的情况下获取输出的方法:使用 php 的 var_dump 函数
- 首先使用以下方法绑定 php 函数
<? $xslt->registerPHPFunctions() ?>
并在样式表中使用 xmlns:php="https://php.net/xsl"
- 然后可以像这样调用 var_dump 函数:<xsl:variable name="a" select="php:function('var_dump', $return)" />

我找不到一种方法来调用函数并使其真正打印结果而不创建变量,但是,这只是为了调试……
gabriel dot birke at web dot de
17 年前
每个<xsl:message>标记都会生成一个 PHP 错误(警告级别)。如果要收集并漂亮地打印它们,可以使用一个自定义错误处理函数,该函数在静态变量中收集警告。
Fabrice Bonny
18 年前
回复如何在 XSLT 中使用来自 DTD(内部或外部)的实体。如果这样做,它可以工作

$xsl = new DOMDocument;
$xsl->resolveExternals = TRUE;
$xsl->substituteEntities = TRUE;
$xsl->load(...);

希望这有帮助!;-)
kekoajs at yahoo dot com
19 年前
哇,我花了大部分时间寻找如何将整个测试表达式传递给 XSL 样式表。似乎 XSLT 1.0 规范不支持它,但 PHP 5(也许还有 4s)包含的 EXSLT 允许人们完全做到这一点……

只需添加以下几行即可……

xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"

到<xsl:stylesheet>元素,并在使用存储在<xsl:param>元素中的表达式时编写

<xsl:if test="dyn:evaluate($param-name)">

瞧!您现在可以在样式表中使用外部生成的表达式了!

EXSLT 添加了许多可类似地集成到 XSL 中的有用函数。您可以访问http://exslt.org/以了解更多信息……
匿名
18 年前
启用 libxslt 库,PHP 5,在 Windows 下

启用
在您的 php.ini 中
1. 取消注释 ;extension=php_xsl.dll
2. 将 extension_dir 更改为
extension_dir = "./ext"

确认
1. 在 test.php 页面中
<?php phpinfo() ?>
2. 运行 test.php
3. 搜索“libxslt 版本”。它应该在以 XSL 为标题的表中返回版本号。

更多信息请访问 Google
"配置和测试支持 XSL 的 PHP 服务器"
basslines at gmail dot com
18 年前
据我所知,LibXML/LibXSLT/LibEXSLT 最近的稳定版本**不支持** XPath 2.0 / XSLT 2.0 转换。我发现唯一支持 XSLT 2.0 的是 Java 的 SAXON 处理器(http://saxon.sourceforge.net/)。
rojaro
20 年前
如果你想使用来自变量(例如 $xmldata)的 XML,但 XSLT 样式表来自文件,你也可以用以下方法:

<?php
$xslt
= new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load('filename.xsl'));
print
$xslt->transformToXML(DomDocument::loadXML($xmldata));
?>
Vasil Rangelov
17 年前
@basslines at gmail dot com
"
据我所知,LibXML/LibXSLT/LibEXSLT 最近的稳定版本**不支持** XPath 2.0 / XSLT 2.0 转换。我发现唯一支持 XSLT 2.0 的是 Java 的 SAXON 处理器(http://saxon.sourceforge.net/)。
"

使用 SAXON 或 AltovaXML 及其 JAVA 绑定可能会是一项很困难的任务,而 .NET 似乎存在 bug(至少对我来说是这样)。但是,我创建了一个类,它从命令行使用 SAXON 或 AltovaXML。AltovaXML 也可以与 COM 一起使用,前提是将其注册为 COM 组件。

你可以从以下地址下载我的包装器:
http://xslt2processor.sourceforge.net/

我仍然需要实现更优雅的错误处理(XSL 扩展使用 Libxml 函数的方式),并且一旦修复了以下 bug:
http://bugs.php.net/bug.php?id=41577
我将实现 .NET 接口。

感谢任何反馈。
appletalk at gmail dot com
19 年前
正如你们许多人可能注意到的,如果存在“&nbsp;”实体,DOM 解析器会给出错误。E_WARN 消息如下所示

警告:DOMDocument::load() [function.load]:在...中未定义实体“nbsp”

有很多方法可以解决这个问题
a) 困难的方法
<xsl:text disable-output-escaping="yes"> &amp;nbsp;</xsl:text>

b) 定义 &nbsp;
在文档顶部,在<?xml?>定义之后,添加
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp "&#160;" >
]>

c) 外部文档类型声明
如果你需要其他 HTML 实体,你可以调用具有适当定义的外部文档类型声明。

<!DOCTYPE page SYSTEM "http://gv.ca/dtd/character-entities.dtd">

当然,你可以下载该文件并将其放置在你的服务器上。
mnot at mnot dot net
17 年前
你可以为 XSLT 的 document() 函数(以及 DTD 外部引用)设置要使用的 HTTP 代理,方法是在环境中设置 http_proxy。

例如,在 Apache 配置中:

SetEnv http_proxy http://127.0.0.1:3128/
sudhir dot vis at gmail dot com
15 年前
以下是用 PHP 转换 XML 的最简单方法:

<?php
$sXml
= "<xml>";
$sXml .= "<sudhir>hello sudhir</sudhir>";
$sXml .= "</xml>";

# 加载 XML 文件
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# 开始 XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
# 打印
print $xslt->transformToXML( $XML );
?>
geoffreyj dot lee at gmail dot com
17 年前
以下是一些关于跨浏览器兼容性的有用提示。

假设

<script type="text/javascript" src="test.js"></script>

XSLT 会自动将其压缩为

<script type="text/javascript" src="test.js"/>

虽然这很好,但 Internet Explorer 在空脚本标签上会出错。所以,简单的解决方法是添加一些内容来防止空标签。例如

<script type="text/javascript" src="test.js"><xsl:comment/></script>

生成

<script type="text/javascript" src="test.js">

</script>

------------------------

此外,以下是如何使用 IE 的条件注释:

<xsl:comment>[if gte IE 5]&#62;
&#60;link rel="stylesheet" type="text/css" href="ie.css" /&#62;
&#60;![endif]</xsl:comment>

生成

<!--[if gte IE 5]>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

这将允许你隔离与 IE 相关的 CSS,而无需使用难看的 CSS hacks。
jw at jwscripts dot com
20 年前
以下代码是支持调用一些旧的 xslt_* 函数的包装器:

<?

if (PHP_VERSION >= 5) {
// 模拟旧的 xslt 库函数
function xslt_create() {
return new XsltProcessor();
}

function xslt_process($xsltproc,
$xml_arg,
$xsl_arg,
$xslcontainer = null,
$args = null,
$params = null) {
// 首先准备参数
$xml_arg = str_replace('arg:', '', $xml_arg);
$xsl_arg = str_replace('arg:', '', $xsl_arg);

// 创建 DomDocument 类的实例
$xml = new DomDocument;
$xsl = new DomDocument;

// 加载 xml 文档和 xsl 模板
$xml->loadXML($args[$xml_arg]);
$xsl->loadXML($args[$xsl_arg]);

// 加载 xsl 模板
$xsltproc->importStyleSheet($xsl);

// 定义参数时设置参数
if ($params) {
foreach ($params as $param => $value) {
$xsltproc->setParameter("", $param, $value);
}
}

// 开始转换
$processed = $xsltproc->transformToXML($xml);

// 指定时将结果放入文件
if ($xslcontainer) {
return @file_put_contents($xslcontainer, $processed);
} else {
return $processed;
}

}

function xslt_free($xsltproc) {
unset($xsltproc);
}
}

$arguments = array(
'/_xml' => file_get_contents("newxslt.xml"),
'/_xsl' => file_get_contents("newxslt.xslt")
);

$xsltproc = xslt_create();
$html = xslt_process(
$xsltproc,
'arg:/_xml',
'arg:/_xsl',
null,
$arguments
);

xslt_free($xsltproc);
print $html;

?>
pb at online-magazin dot at
17 年前
调用 Saxon XSLT 处理器是一项非常简单的任务!

你只需要执行一些简单的步骤:

1. 为 PHP 安装 JavaBridge。

2. 从 http://saxon.sourceforge.net/ 下载免费的 (B) Saxon 发行版。

3. 将 jar 文件放在你能够访问的目录中。

4. 使用以下代码示例:

// jar 文件所在的目录
define("SAXON_DIR", $_SERVER['DOCUMENT_ROOT']."/saxonb8.9.0/");

// 包含 jar 文件
java_require(SAXON_DIR."saxon8.jar;".SAXON_DIR."saxon8-dom.jar");


$sXslFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xsl"; // xsl 文件
$sXmlFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xml"; // xml 文件

try
{
$oXslSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXslFile);
$oXmlSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXmlFile);

$oFeatureKeys = new JavaClass("net.sf.saxon.FeatureKeys");

// 创建工厂
$oTransformerFactory = new java("net.sf.saxon.TransformerFactoryImpl");

// 禁用源文档验证
$oTransformerFactory->setAttribute($oFeatureKeys->SCHEMA_VALIDATION, 4);

// 创建新的转换器
$oTransFormer = $oTransformerFactory->newTransformer($oXslSource);

// 创建 StreamResult 来存储输出
$oResultStringWriter = new java("java.io.StringWriter");
$oResultStream = new java("javax.xml.transform.stream.StreamResult", $oResultStringWriter);

// 转换
$oTransFormer->transform($oXmlSource, $oResultStream);

// 输出转换结果
echo java_cast($oResultStringWriter->toString(), "string");

}
catch(JavaException $e){
echo java_cast($e->getCause()->toString(), "string");
exit;
}

5. 尽情享受

这运行得相当不错。
venkatesh at lammersmedical dot com
19 年前
以下函数用于读取保存为文本文件的 XSL 表格。

function ReadExcelSheet($filename){
$test=file($filename);
$ar1=str_replace("~[^\t]*\t","\t",$test);
$ar2=str_replace("~","",$ar1);
$ar=str_replace("?","",$ar2);
$temp=array();
for ($i=0; $i<count($ar); $i++) {
if((substr($ar[$i],0,1)!= "\t")){
if($ar[$i]!=="\r\n"){
array_push($temp,$ar[$i]);
}
}
}
$name=split("\t",$temp[0]);
$ExcelList=array();
for($i=1;$i<count($temp);$i++){
$split_result=split("\t",$temp[$i]);
array_push($ExcelList,$split_result);
}
$result=insert_into_array($ExcelList,0,$name);
return($result);
}
visual77 at gmail dot com
16 年前
XSLTProcessor 用于生成整个网站有点麻烦,主要是因为通过 DOMDocument 的 createElement 和 appendChild 函数构建 XML 树的过程很繁琐。



如果想要仅使用 XML 和 XSL(这确实比直接输出 HTML 更优越)构建整个网站,可以使用一个对象来处理所有 PHP 数据结构到 XML 数据树的转换,并结合 XSLTProcessor 进行渲染。一个很好的对象是 DOMi,您可以在 http://domi.sourceforge.net. 找到它。
Ryan D. Hatch
17 年前
正在寻找 php_xsl.dll 吗?

如果您使用 MSI 安装程序在 Windows 上安装,则可能没有它。

1.) 添加/删除程序并更改 PHP 安装。选择 XSL 扩展。



2.) 下载 PHP 的完整 .zip 文件,然后您可以将 php_xsl.dll 复制到您的 PHP/etc 目录中。

只是一个说明。

Ryan D. Hatch
shangxiao at php dot net
16 年前
当使用 DOM API 动态地向样式表添加 xsl 命令时,请确保使用 createElementNS() 而不是 createElement(),否则 XSLTProcessor 将无法识别这些 DOM 节点。

例如
$xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');
allens at nospam dot com
15 年前
问题
收到 Netbeans 错误消息
致命错误:找不到类 'xsltprocessor'

解决方法
将 php.ini 的副本放置在 c:\windows 目录中!

默认情况下,php.ini 文件已禁用 xsl……搜索以下行

;extension=php_xsl.dll

要启用 XSL……删除 ; 以便包含扩展名

然后,如果 Netbeans 给您以下消息
PHP 启动:无法加载动态库 './php_xsl.dll'

那么您需要再次运行 php-5.2.9-1-win32-installer.msi
这次选择 XSL 扩展!
To Top