我正在构建几个XSLT样式表(例如“hotels.xsl”,“flights.xsl”,“tickets.xsl”等等),它们都将使用相同的XML文档作为源(称为“schedule.xml”) “在这种情况下”并输出HTML。使用XML和XSLT的最终过程将自行处理,但我正在寻找在处理它们时进行预览的最佳方法。现在,我将schedule.xml文件的副本保存在与正在运行的XSLT文档相同的目录中,并使用处理指令在Web浏览器中预览单个样式表。例如,使用:
<?xml-stylesheet type="text/xsl" href="hotels.xsl"?>
当然,这意味着我要么必须更改样式表引用,要么制作XML文档的多个副本,每个副本都包含自己的样式表引用,以便在浏览器中查看HTML输出。做这些事情并不是一件巨大的痛苦,但如果可能的话,我想避免它们加速。
所以问题就变成了:
如果没有编写一个小脚本来帮助完成这个过程,有没有办法在浏览器中查看每个样式表的HTML输出,而无需更改链接或制作多个XML副本?
答案 0 :(得分:2)
答案 1 :(得分:1)
我最终编写了一个PHP文件,在我的localhost Web服务器上运行。它是一个模板,只需要更改一个变量来标识要转换的XML文件的路径。当它被调用时,它会在插入适当的样式表处理指令的情况下提供该XML。
我喜欢这种方法的是:
php文件的模板代码是:
<?php
// Set the path to the XML file you want to use.
$xmlPath = "example.xml";
////////////////////////////////////////////////////////////////////////////////
// You shouldn't have be mess with any of this.
// Let the browser know XML is on the way.
header('Content-type: text/xml');
// get the basename of the current file
$fileBaseName = basename($_SERVER["SCRIPT_NAME"], ".php");
// setup the stylesheet to use
$xsltStylesheet = sprintf('<?xml-stylesheet type="text/xsl" href="%s.xsl"?>', $fileBaseName);
// pull in the contents of the source XML file.
$xmlData = file_get_contents($xmlPath);
// split the file data looking for processing instructions
$splitArray = explode("?>", $xmlData);
// Pop the main data off the end of the array
$mainData = array_pop($splitArray);
// If there were no headers, push a default onto the split array
if(count($splitArray) == 0) {
array_push($splitArray, '<?xml version="1.0" encoding="UTF-8"?>');
array_push($splitArray, $xsltStylesheet);
}
// otherwise check the headers to see if there is already a stylesheet
else {
// set a flag to watch for a stylesheet
$hasStylesheet = 0;
// loop thru the headers
foreach ($splitArray as &$splitItem) {
// add the closing string back in.
$splitItem .= '?>';
// See if it's a stylesheet call
if(strrpos($splitItem, '<?xml-stylesheet')) {
// update the flag to show you hit a stylesheet
$hasStylesheet = 1;
// change the href call for the style sheet.
$splitItem = preg_replace('/\shref="[^"]*"/', ' href="' . $fileBaseName . '.xsl"', $splitItem);
}
}
// If you didn't find a stylesheet instruction, add it.
if(!$hasStylesheet) {
array_push($splitArray, $xsltStylesheet);
}
}
// reassemble the data
$mainData = implode("\n", $splitArray) . $mainData;
echo $mainData;
要使用它,
在当前状态下,此代码应该非常强大。它会将样式表调用添加到尚未拥有它们的XML文件中,并更改样式表调用。与任何事情一样,它可以构建得更多,但它涵盖了我现在需要的东西。