Как скопировать файл из Интернета на локальный диск с помощью xsl (file: copy) - PullRequest
0 голосов
/ 26 сентября 2018

Я бы хотел скопировать 3 файла с интернет-адреса на мой локальный диск с помощью xsl.

У меня нет выбора: использовать xsl - это то, что я должен использовать - не мой вызов.

Я нашел file:copyфункция из expath.org, но я не могу понять синтаксис.

Может ли кто-нибудь опубликовать простой пример, который работает?Я уверен, что как только увижу, чего хочет от меня функция: $source, $target и т. Д., Я буду в порядке.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Если вы хотите написать одну таблицу стилей XSLT 3.0 (необходимо запустить с Saxon 9.8 и параметрами командной строки -it -xsl:sheet.xsl (вы можете добавить -t для отладки, чтобы увидеть, куда Saxon пишет)) загрузка трех жестко-закодированныхURL-адреса, например,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

    <xsl:param name="url1" as="xs:string?" select="'http://example.com/file1.txt'"/>
    <xsl:param name="url2" as="xs:string?" select="'http://example.com/file2.txt'"/>
    <xsl:param name="url3" as="xs:string?" select="'http://example.com/file2.txt'"/>


    <xsl:param name="source-urls" as="xs:string*" select="$url1, $url2, $url3"/>

    <xsl:template name="xsl:initial-template">
        <xsl:for-each select="$source-urls">
            <xsl:variable name="file-name" select="tokenize(., '/')[last()]"/>
            <xsl:message select="'Writing ', ., ' to ', $file-name"/>
            <xsl:result-document href="{$file-name}" method="text"><xsl:value-of select="unparsed-text(.)"/></xsl:result-document>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Обратите внимание, что unparsed-text может потребоваться второй параметр кодирования для правильного чтения удаленного файла (по умолчанию UTF-8, если он неизвестен или не читается), и что xsl:result-documentзаписывает его в кодировке UTF-8 по умолчанию. Я думаю, вы можете изменить его с помощью атрибута encoding.Конечно, все это не просто копирование, как file:copy.

0 голосов
/ 27 сентября 2018

Для функций расширения в Saxon, включая файловый модуль EXPath, требуется Saxon-PE и коммерческая лицензия.

Функция EXPath file:copy() может копировать файл из одного места в другое, но оба должны быть доступныпо имени файлаПоэтому его нельзя использовать непосредственно для копирования ресурса, который адресован URL-адресом и получен из Интернета.

Если ресурс является XML, я бы использовал функцию document() для его чтения и xsl:result-documentинструкция для его записи.

Если ресурс представляет собой неразобранный текст, я бы использовал функцию unparsed-text() для его чтения и file:write() для его записи.

Если ресурс является двоичным (и к нему обращаются)по HTTP), тогда я не уверен, что есть готовый способ чтения в Saxon, хотя достаточно легко создать пользовательскую функцию расширения для работы.

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