У меня есть локальная таблица стилей, подобная следующей, т. е. она имеет атрибут 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?
@nwellnhof, можете ли вы сказать, это причуда или ошибка в xsltproc/libxslt?
Кажется, используя libxslt в Python с lxml, я могу использовать urllib3 или некоторые библиотеки запросов для реализации Resolver, чтобы обеспечить лучшую поддержку URL-адресов HTTP (S). Все еще не уверен, является ли ошибка, описанная в вопросе, каким-то ограничением безопасности в xsltproc/libxslt, которое можно изменить с помощью некоторой конфигурации, или я ошибочно предполагаю, что разрешение URL-адресов HTTP (S?) должно работать.
Некоторые процессоры могут отказаться загружать внешние таблицы стилей. Другие требуют, чтобы его включили с помощью флага. Это сделано из соображений безопасности.
@DJL, есть какие-нибудь конкретные сведения о том, что это за настройка или каковы настройки для xsltproc? У него есть опция --nonet, задокументированная как refuse to fetch DTDs or entities over network, но мне не ясно, почему она не загружается через HTTP(S), если эта опция не используется. То, что соображения безопасности в наши дни часто означают, что разрешение внешних файлов по умолчанию отключено, для меня не новость, это происходит, например, с MSXML 6 по умолчанию, но у него есть свойство, которое я могу установить в значение true (например, resolveExternals = true).
@MartinHonnen, если честно, я не знаком с xsltproc, поэтому совет был общим. однако я отмечу, что включенный вами файл xslt не является ни DTD, ни объектом (ни документом). Вы пробовали использовать подробный флаг?
@DJL, да, я тоже пробовал подробный вариант, но, насколько я могу судить, он не дал никаких подробностей о том, почему не удалось загрузить модуль XSLT, он выдал много дополнительных подробностей, но три строки, которые я показываю в вопросе вроде остались только три строчки, связанные с невозможностью загрузки модуля XSLT. Понятия не имею, почему вы считаете включенный файл XSLT не объектом и не документом, любая правильно сформированная таблица стилей XSLT является правильно сформированным XML-документом.
@MartinHonnen Сущность объявляется следующим образом: <!ENTITY name "value">. И хотя вы правы в том, что xslt можно рассматривать как документ, в контексте xslt он специально загружается с помощью функции document.
@DJL, это довольно ограниченное определение сущности и документа, которым я не разделяю. И обратите внимание, что xsltproc выдает ошибку «не удалось загрузить внешний объект».
@MartinHonnen - Я не знаю, что еще тебе сказать.
@DJL, я бы посоветовал вам прочитать спецификацию w3.org/TR/xml/#sec-physical-struct: «[Определение: XML-документ может состоять из одной или нескольких единиц хранения. Они называются сущностями; они все они имеют содержимое и все (за исключением сущности документа и внешнего подмножества DTD) идентифицируются по имени сущности.] Каждый XML-документ имеет одну сущность, называемую сущностью документа, которая служит отправной точкой для процессора XML и может содержать всю документ." чтобы лучше понять, что такое сущность или документ.





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