有没有办法预览多个工作在同一XML上的XSLT样式表?

时间:2011-08-04 17:56:37

标签: xml xslt

我正在构建几个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副本?

2 个答案:

答案 0 :(得分:2)

  1. 使用像oXygen这样的XML开发环境来设置多个“转换方案”,每个“转换方案”都配置为将其输出发送到浏览器进行预览。您可以通过在样式表缓冲区之间切换来在场景之间切换。
  2. 使用像Cocoon或Calabash(甚至Servlex)这样的XML开发框架来为每个样式表配置管道。在Cocoon和Servlex中,可以通过单独的URL选择不同的管道。
  3. 这些都需要一些设置时间,但可能是值得的,这取决于您的开发/测试的强度。另一方面,您的多份XML文档构思非常易于设置和快速使用。只要文档不经常更改。

答案 1 :(得分:1)

我最终编写了一个PHP文件,在我的localhost Web服务器上运行。它是一个模板,只需要更改一个变量来标识要转换的XML文件的路径。当它被调用时,它会在插入适当的样式表处理指令的情况下提供该XML。

我喜欢这种方法的是:

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

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)并查看转换结果。
  5. 在当前状态下,此代码应该非常强大。它会将样式表调用添加到尚未拥有它们的XML文件中,并更改样式表调用。与任何事情一样,它可以构建得更多,但它涵盖了我现在需要的东西。