Xsltproc выдает предупреждение: «не удалось загрузить внешний объект» и ошибку «xsl:include: невозможно загрузить..» для xsl:include в URL-адрес HTTPS

У меня есть локальная таблица стилей, подобная следующей, т. е. она имеет атрибут xsl:include с атрибутом href, указывающим на URL-адрес https:

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">

<xsl:include href = "https://martin-honnen.github.io/xslt/foo-transform-module.xsl"/>

<xsl:template match = "@* | node()">
    <xsl:copy>
        <xsl:apply-templates select = "@* | node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

У меня в трех разных системах xsltproc не может обработать локальную таблицу стилей (например, xsltproc xslt-test1.xsl sample1.xml), выдавая предупреждение и ошибку:

warning: failed to load external entity "https://martin-honnen.github.io/xslt/foo-transform-module.xsl"
compilation error: file xslt-test1.xsl line 3 element include
xsl:include : unable to load https://martin-honnen.github.io/xslt/foo-transform-module.xsl

Другие процессоры XSLT, похоже, способны находить и загружать включенную таблицу стилей и выводить данные, например.

<root>
  <transformed-foo>foo 1</transformed-foo>
  <bar>bar 1</bar>
</root>

для входного файла sample1.xml, например

<root>
  <foo>foo 1</foo>
  <bar>bar 1</bar>
</root>

Я просмотрел параметры xsltproc, но нашел только опцию --nonet, позволяющую запретить загрузку внешних объектов. Я не вижу никаких значений по умолчанию, которые объясняли бы, почему не удается получить доступ по HTTPS.

Может ли кто-нибудь воспроизвести эту проблему или, если нет, подскажите, какая настройка мне нужна, чтобы xsltproc загружал включенный модуль XSLT?

Я вижу ту же проблему.

michael.hor257k 01.06.2024 21:45

@nwellnhof, можете ли вы сказать, это причуда или ошибка в xsltproc/libxslt?

Martin Honnen 01.06.2024 23:40

Кажется, используя libxslt в Python с lxml, я могу использовать urllib3 или некоторые библиотеки запросов для реализации Resolver, чтобы обеспечить лучшую поддержку URL-адресов HTTP (S). Все еще не уверен, является ли ошибка, описанная в вопросе, каким-то ограничением безопасности в xsltproc/libxslt, которое можно изменить с помощью некоторой конфигурации, или я ошибочно предполагаю, что разрешение URL-адресов HTTP (S?) должно работать.

Martin Honnen 02.06.2024 19:40

Некоторые процессоры могут отказаться загружать внешние таблицы стилей. Другие требуют, чтобы его включили с помощью флага. Это сделано из соображений безопасности.

DJL 04.06.2024 16:15

@DJL, есть какие-нибудь конкретные сведения о том, что это за настройка или каковы настройки для xsltproc? У него есть опция --nonet, задокументированная как refuse to fetch DTDs or entities over network, но мне не ясно, почему она не загружается через HTTP(S), если эта опция не используется. То, что соображения безопасности в наши дни часто означают, что разрешение внешних файлов по умолчанию отключено, для меня не новость, это происходит, например, с MSXML 6 по умолчанию, но у него есть свойство, которое я могу установить в значение true (например, resolveExternals = true).

Martin Honnen 04.06.2024 16:49

@MartinHonnen, если честно, я не знаком с xsltproc, поэтому совет был общим. однако я отмечу, что включенный вами файл xslt не является ни DTD, ни объектом (ни документом). Вы пробовали использовать подробный флаг?

DJL 05.06.2024 09:04

@DJL, да, я тоже пробовал подробный вариант, но, насколько я могу судить, он не дал никаких подробностей о том, почему не удалось загрузить модуль XSLT, он выдал много дополнительных подробностей, но три строки, которые я показываю в вопросе вроде остались только три строчки, связанные с невозможностью загрузки модуля XSLT. Понятия не имею, почему вы считаете включенный файл XSLT не объектом и не документом, любая правильно сформированная таблица стилей XSLT является правильно сформированным XML-документом.

Martin Honnen 05.06.2024 10:16

@MartinHonnen Сущность объявляется следующим образом: <!ENTITY name "value">. И хотя вы правы в том, что xslt можно рассматривать как документ, в контексте xslt он специально загружается с помощью функции document.

DJL 05.06.2024 11:03

@DJL, это довольно ограниченное определение сущности и документа, которым я не разделяю. И обратите внимание, что xsltproc выдает ошибку «не удалось загрузить внешний объект».

Martin Honnen 05.06.2024 11:17

@MartinHonnen - Я не знаю, что еще тебе сказать.

DJL 05.06.2024 15:02

@DJL, я бы посоветовал вам прочитать спецификацию w3.org/TR/xml/#sec-physical-struct: «[Определение: XML-документ может состоять из одной или нескольких единиц хранения. Они называются сущностями; они все они имеют содержимое и все (за исключением сущности документа и внешнего подмножества DTD) идентифицируются по имени сущности.] Каждый XML-документ имеет одну сущность, называемую сущностью документа, которая служит отправной точкой для процессора XML и может содержать всю документ." чтобы лучше понять, что такое сущность или документ.

Martin Honnen 05.06.2024 15:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, согласно https://gitlab.gnome.org/GNOME/libxml2/-/blob/master/README.md, существуют различные варианты сборки libxml/libxslt, включать ли модули, один из них нахождение --with-http HTTP support (off) там, где, как я предполагаю, off указывает на то, что по умолчанию поддержка HTTP не включена.

Я думаю, это объясняет то, что все установки, которые я пробовал (пакет xsltproc в различных выпусках WSL Ubuntu Linux), вероятно, были построены с этой настройкой по умолчанию и, следовательно, без поддержки HTTP.

Другие вопросы по теме