Подтвердить что ты не робот

Применение XSL к внешнему XML

В настоящее время я использую:

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

Чтобы связать XSL с XML.

Если мой xml был здесь: www.externaldomain.com/rss.xml(вне моего домена), как я могу связать XSL с XML?

Могу ли я указывать XSL на файл или ссылку?

4b9b3361

Ответ 1

Вы не можете достичь этого с помощью "чистого" xml + xslt (*). Некоторый внешний код должен будет идентифицировать xml и xslt, которые должны его преобразовать.

Поскольку вы, кажется, трансформируете XML, я собираюсь предположить, что вы делаете это в веб-браузере.

Вы можете сделать это с помощью javascript, так как демонстрируется в w3schools. Тем не менее, междоменные ограничения по-прежнему применяются, если вы выполняете запросы на основе javascript (например, AJAX/XHR): если исходный сервер не устанавливает соответствующие заголовки CORS, чтобы разрешить доступ к javascript для междоменного доступа, вам потребуется прокси-сервер этот запрос xml через ваш собственный сервер.

(*): Безумный ответ использует ссылки на сущности для умного встраивания внешнего xml в содержащий документ. Это определенно стоит попробовать, но имейте в виду, что такое включение на основе сущностей использовалось в нескольких утечках для раскрытия информации, поэтому он часто не включается в синтаксический анализатор xml (в частности, это не должно быть способным подорвать CORS в браузере). Вам просто нужно попробовать его в вашей ситуации.

Ответ 2

Вы можете создать локальный XML файл, который содержит XML-содержимое удаленного XML файла с помощью ссылки на сущность.

В приведенном ниже примере вы получите содержимое удаленного XML файла внутри элемента документа оболочки.

Затем вы можете включить инструкцию обработки стилей в свой локальный файл XML.

Однако, поскольку локальный файл имеет элемент документа оболочки, вам может потребоваться указать "оберточный XSLT", который использует xsl: import для импорта исходных XSL.xsl и -templates, начиная с содержимого внутри элемента оболочки.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wrapper [
<!ENTITY content SYSTEM "http://stackoverflow.com/feeds">
]>
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?>
<wrapper>
    &content;
</wrapper>

Ответ 3

Если вы пытаетесь запустить XSLT внутри .NET, вы можете легко использовать класс XslCompiledTransform в .NET для достижения этого.

Если вы пытаетесь запустить это, например, в командной строке есть набор инструментов, которые вы можете использовать для применения XSLT файла к данному XML файлу - обычно, как правило, на вашем локальном жестком диске.

См. Олег Ткаченко на веб-сайте информация о NXSLT и других инструментах XSLT или см. Это CodeProject для расширения оболочки Windows для применения XSLT к данному XML файлу (на вашем локальном жестком диске).

Надеюсь, это немного поможет.

Марк

Ответ 4

Вы можете написать локальный XML файл в качестве оболочки:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="XSL.xsl" ?>
<wrapper Source="http://www.externaldomain.com/rss.xml"/>

И расширьте таблицу стилей так, чтобы она поняла обертку:

<xsl:template match="wrapper">
  <xsl:apply-templates select="document(./@Source)"/>
</xsl:template>

Я не тестировал его с XML файлами по http, но он работает с локальными XML файлами, которые я не хочу изменять, чтобы включить инструкцию по обработке xml-stylesheet. Он работает с Firefox, Opera и IE (7, я еще не пробовал другие версии)