XSL

添加笔记

用户贡献的笔记 23 笔记

5
匿名
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 函数的功能要差得多。
3
adrian at foeder dot de
17 年前
如果您想在 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')" />
2
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));
}
?>
1
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)" />

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

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

希望这有帮助! ;-)
1
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/ 了解更多信息...
1
rd at jerntorget dot se
19 年前
如果您收到以下警告消息

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

解决此问题的一种方法是在 &nbsp; 周围使用 span 标签,例如:<span>&nbsp;</span>
2
rojaro
20 年前
如果您想使用来自变量的 XML,例如 $xmldata,但 XSLT 样式表来自文件,您也可以按照以下方式执行

<?php
$xslt
= new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load('filename.xsl'));
print
$xslt->transformToXML(DomDocument::loadXML($xmldata));
?>
1
basslines at gmail dot com
18 年前
据我所知,LibXML/LibXSLT/LibEXSLT 的最新稳定版本 *不支持* xPath 2.0 / XSLT 2.0 转换。我找到的唯一对 XSLT 2.0 的支持是在 Java 的 SAXON 处理器中 (http://saxon.sourceforge.net/).
1
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">

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

例如,在 Apache 配置中;

SetEnv http_proxy http://127.0.0.1:3128/
1
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 技巧。
1
Anonymous
18 年前
在 Windows 下启用 libxslt 库和 PHP 5

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

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

更多信息请 Google 搜索
"Configuring and Testing PHP Servers for XSL Support"
0
sudhir dot vis at gmail dot com
15 年前
以下是从 PHP 中转换 xml 的最简单方法

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

# LOAD XML FILE
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
#PRINT
print $xslt->transformToXML( $XML );
?>
0
pb at online-magazin dot at
16 年前
调用 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);

// 创建一个新的 Transformer
$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. 享受

这运行良好。
0
Vasil Rangelov
16 年前
@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 似乎有错误(至少对我来说是如此)。但是,我创建了一个类,它从命令行使用 SAXON 或 AltovaXML。如果 AltovaXML 注册为 COM 组件,也可以使用 COM。

您可以从以下位置下载我的包装器
http://xslt2processor.sourceforge.net/

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

欢迎您提供任何反馈。
0
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);
}
0
jw at jwscripts dot com
19 年前
以下代码是支持调用一些旧的 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;

?>
-1
visual77 at gmail dot com
15 年前
XSLTProcessor 在生成整个网站时有点麻烦,主要是因为通过 DOMDocument 的 createElement 和 appendChild 函数构建 XML 树的过程很繁琐。

为了从只有 XML 和 XSL 的东西中获得整个网站(这实际上比只回显 HTML 的系统更好),您可以使用一个对象来完成所有 PHP 数据结构到 XML 数据树的转换,并与 XSLTProcessor 结合以进行渲染。DOMi 这样的好对象可以在 http://domi.sourceforge.net. 找到。
-2
Ryan D. Hatch
17 年前
正在寻找 php_xsl.dll 吗?

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

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

或者

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

只是一个注意。

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

例如
$xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');
-3
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