Применение XSL к внешнему XML
В настоящее время я использую:
<?xml-stylesheet type="text/xsl" href="XSL.xsl"?>
Чтобы связать XSL с XML.
Если мой xml был здесь: www.externaldomain.com/rss.xml(вне моего домена), как я могу связать XSL с XML?
Могу ли я указывать XSL на файл или ссылку?
Ответы
Ответ 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, я еще не пробовал другие версии)
Ответ 5
Одно из решений: получить внешний XML в объект XMLDocument, а затем вставить узел, содержащий оператор включения xsl. Включить xsl можно по адресу http://adityabajaj.com/weblog/include-xsl-in-x-ml/.