2011-08-04 54 views
2

我正在构建几个XSLT样式表(例如“hotels.xsl”,“flights.xsl”,“tickets.xsl”等),它们将使用与源文件相同的XML文档(称为“schedule.xml”在这种情况下)并输出HTML。使用XML和XSLT的最终过程将自行处理,但我正在寻找在处理它们时进行预览的最佳方法。现在,我将schedule.xml文件的副本保存在与正在运行的XSLT文档相同的目录中,并使用处理指令在Web浏览器中预览单个样式表。例如,使用:有没有办法预览使用同一个XML的多个XSLT样式表?

<?xml-stylesheet type="text/xsl" href="hotels.xsl"?> 

当然,这意味着我要么必须改变样式表引用,或使XML文档都包含自己的样式参考看到浏览器的HTML输出的多个副本。做任何一件事情都不是一件很痛苦的事情,但是如果可能的话,我想尽量避免它们来加快速度。

所以,问题就变成了:

短编写一个脚本来帮助的过程中,有没有办法看到每个样式浏览器的HTML输出没有任何改变的链接或制作多XML的副本?

回答

1

我写了一个PHP文件在我的localhost web服务器上运行。这是一个仅需要更改一个变量的模板,以识别要转换的XML文件的路径。当它被调用时,它会通过插入适当的样式表处理指令来传递该XML。

我喜欢这种方法的事情是:

  • 建立新的转换测试是快速和容易。只需复制php文件,重命名它并在必要时将路径更改为XML。
  • 测试更新的XML数据非常简单。与具有源XML文档的多个副本相比,此方法使用单个文件。当对它进行更新时,会在每次转换中看到它们。
  • 使用热键可以非常快速地检查更改。一个快速的Cmd + S,Cmd + Tab,Cmd + R将样式表保存在编辑器中,跳转到浏览器并重新加载速度非常快,但几乎不引人注意。
  • 由于XML文档的路径是在代码中定义的,我可以在需要时使用它中的变量。例如,传递一个唯一的ID来提取名称中相应值的文件。
  • 没有其他软件可以安装,因为我的机器已经有了Apache并且运行了php。

的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; 

要使用它,

  1. 的目录中是通过Web服务器访问创建样式表。
  2. 使用与样式表相同的基本文件名在同一目录中复制PHP代码。例如,如果样式表是“test-example.xsl”,那么php文件将是“test-example.php”。
  3. 更新php文件中的“$ xmlPath”变量以指向用于测试的XML。
  4. 通过网络浏览器打开php页面(例如http://localhost/test-example.php)并查看转换结果。

在当前状态下,此代码应该非常健壮。它会将样式表调用添加到尚未拥有它们的XML文件中,并将样式表调用更改为具有这些样式的调用。和其他任何东西一样,它可以被构建得更多,但它涵盖了我现在需要的东西。

2
  1. 使用XML的开发环境,比如oXygen设立多个“改造的方案”,其中的每一个配置为将其输出发送到浏览器预览。您可以通过在样式表缓冲区之间切换来切换场景。
  2. 使用XML开发框架如Cocoon或Calabash(甚至可以是Servlex)为每个样式表配置管道。在Cocoon和Servlex中,可以通过单独的URL选择不同的管道。

这些都需要一定的准备时间,但可能是值得的,这取决于你的开发/测试多么激烈的。另一方面,您的多个XML文档副本的想法非常容易设置并且很快使用。只要文件不经常更改。

+0

谢谢@LarsH,我会检查出您在第二项中提到的oXygen和其他选项。如果它很容易改变,让我在看到它的时候快速看到内容,那么我就可以使用一些小设置。这不是一个大问题,但似乎有一些确定的空间可以帮助减少这些烦人的任务之一。 –

相关问题