在HTTP查询中为XML文档指定自定义XSL文件

时间:2012-05-27 06:32:01

标签: xml xslt httprequest

我有一个XML目录数据和一个XSL文件来可视化这个目录数据。我用这一行来验证XML。

<?xml-stylesheet type="text/xsl" href="presentation-list-catalog.xsl"?>

这部分效果很好。

我想为设计人员提供一个秘密链接,或者我需要使用另一个XSL文件来验证XML。基本上我只需要更改XSL文件的链接:

<?xml-stylesheet type="text/xsl" href="download-links-catalog.xsl"?>

此XSL文件是XML目录数据的另一个可视化,以便设计人员能够下载高分辨率目录图片。为此,我想使用相同的XML,但使用另一个自定义XSL文件进行转换。

是否可以使用HTTP请求指定自定义XSL文件,如:

http://example.com/catalog.xml?download-links-catalog.xsl

有哪些可能的解决方案?

1 个答案:

答案 0 :(得分:4)

如果您使用的是PHP,则可以采用以下解决方案:

  

catalog.xml指向基于引荐网址提供正确XSL文件的PHP文件。

您可以将此想法移植到其他server-side scripts,例如Ruby,ASP,JSP等。

<强>的catalog.xml

catalog.xml中,不是指向XSL文件,而是指向PHP文件。在此示例中,PHP文件为catalog.php

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="catalog.php"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
</catalog>

<强> catalog.php

catalog.php根据引荐网址提供正确的XSL文件。

<?php
// Output the correct Content-Type, so that browsers know 
// to treat this file as an XSL document
header("Content-Type: text/xsl; charset=utf-8");

// Example $referer: http://example.com/catalog.xml?download-links-catalog.xsl
$referer = parse_url($_SERVER['HTTP_REFERER']);

// Example $query: download-links-catalog.xsl
$query = $referer['query'];

// If the file exists, serve up $query.
// If not, serve up the default presentation-list-catalog.xsl.
$xslFile = file_exists($query) ? $query : "presentation-list-catalog.xsl";
echo file_get_contents($xslFile);
?>

为简洁起见,此示例不包含一些安全检查。例如,您应该验证$query实际上是一个XSL文件。如果没有进行此检查,则黑客可以访问您服务器上的任意文件。

<强>呈现一览catalog.xsl

这个XSL文件没什么奇怪的。请注意,h2代码中的文字为Presentation List Catalog

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
  <h2>Presentation List Catalog</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

下载链接-catalog.xsl

此XSL文件与presentation-list-catalog.xsl相同,但h2代码中的文字为Download Links Catalog

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
  <h2>Download Links Catalog</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

您能期待什么

使用上述设置,导航至http://example.com/catalog.xml
将使用catalog.xml提供presentation-list-catalog.xsl

导航至http://example.com/catalog.xml?download-links-catalog.xsl
将使用catalog.xml提供download-links-catalog.xsl

上面的示例XML和XSL文件取自W3Schools关于"XSLT - Transformation."的文章