Использование XSLT-документа () в браузерах WebKit
У меня возникла проблема при попытке включить и получить доступ к нескольким документам XML в таблице стилей XSL. Я назначаю узлы документа в качестве переменных, а затем пытаюсь получить к ним доступ в своем шаблоне xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:variable name="doc1" select="document('test.xml')" />
<xsl:template match="/">
<div>
<span id="id_total">
<xsl:value-of select="count($doc1//Root)"/>
</span>
</div>
</xsl:template>
</xsl:stylesheet>
Я получаю правильный счет при использовании IE и Firefox, однако любой браузер WebKit (Safari, Chrome) дает мне счет 0. Есть мысли?
2 ответа
Chrome имеет перекрестную политику происхождения, которая запрещает включение локальных файлов. Функция документа может ссылаться только на себя локально:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="pitarget.xml"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:variable name="gal" select="'howdy'"/>
<?var gal?><!--howdy-->
<?echo gal?>
<?html5 ?>
<xsl:output method="html" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates select="processing-instruction()"/>
</xsl:template>
<xsl:template match="/">
<xsl:value-of select="processing-instruction('html5')"/>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="processing-instruction('echo')">
<xsl:value-of select="//xsl:variable/@select[../@name=current()]"/>
<xsl:value-of select="count(document('pitarget.xml')//*) - 1"/>
</xsl:template>
<xsl:template match="processing-instruction('var')">
<xsl:processing-instruction name="{.}">
<xsl:value-of select="."/>
<xsl:value-of select="./following-sibling::node()"/>
</xsl:processing-instruction>
</xsl:template>
</xsl:stylesheet>
Google решил, что разрешить файлу.xml считывать файл.xlst из файла:// URL - это дыра в безопасности, и они заблокировали его.
Параметр командной строки chrome.exe --allow-file-access-from-files обойдет эту защиту.