2009-09-27 3 views
10

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

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

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

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

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

ответ

2

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

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

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

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

+0

Эта привычная работа, он явно попросил решение, когда xml «Вне моего домена». Javascript не выполняет перекрестный домен. Почему он поддержал ваш ответ за пределами меня, поскольку он явно на 100% ошибочен, и я только понял, что потратив 20 минут, пытаясь заставить этот пример работать ... На самом деле я не могу подумать об одном времени, когда этот пример будет полезен, он работает только с файлами, которые находятся в том же домене, который уже может быть отредактирован ... Поэтому в основном то, что я пытаюсь сказать, это неправильно, и я отказал вам в этом. – Cody

+0

@ Коди: Извините за свое разочарование, я уточню ответ, чтобы подчеркнуть требование для CORS. Если исходный сайт поддерживает CORS, вы, вероятно, можете сделать это в javascript; в противном случае вам нужно проксировать XML. –

+0

@ Коди: Я был оператором для компании, и мы делали некоторые процедуры. Чтобы узнать, можем ли мы продолжить, мы могли бы использовать XML-файл, который был заполнен партнерской организацией, но у нас не было доступа к нему, и не было никакого вопроса просить их что-либо менять в нем. Мы ждали нескольких конкретных сведений, чтобы быть здесь, и файл был очень длинным. Мы хотели бы отображать только содержимое этих тегов. Поэтому мы находимся в этой ситуации, когда нужно применять XSL к внешнему XML-файлу. С уважением. –

3

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

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

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

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

Marc

13

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

Пример ниже предоставит вам содержимое удаленного XML-файла внутри обложки .

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

Однако, так как локальный файл имеет обертку элемент документа, возможно, потребуется указать на «обертку» XSLT, который использует XSL: импорт импортировать исходный XSL.xsl и применяются-шаблоны запуска с содержимым внутри обертки .

<?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> 
2

Вы можете написать локальный файл 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, я еще не пробовал другие версии)

0

Одно решение: Получите внешний XML в объект XMLDocument, а затем вставьте узел, содержащий инструкцию include xsl. Включить xsl можно из http://tipscow.com/how-to-include-xsl-in-xml/.

Смежные вопросы