Nano Hash - криптовалюты, майнинг, программирование

Извлечение параметров URL из XML/XSL

Я пишу приложение для визуализации содержимого нескольких баз данных. Это приложение должно быть максимально простым в установке и использовании, поэтому я решил использовать XML-файлы в качестве баз данных и соответствующим образом преобразовывать их с помощью XSL через браузер. Прямо сейчас файлы XSL запрограммированы на создание сводной таблицы каждой базы данных, и при нажатии на первую ячейку каждой строки появляется более полное описание всей записи. Это означает, что страница содержит все полные описания каждой записи в базе данных, но такая ситуация замедляет загрузку страницы, которая требует до 5 секунд для загрузки нескольких сотен записей. Поскольку в будущем я планирую значительно расширить базы данных, этой проблеме суждено стать намного хуже. Чтобы уменьшить нагрузку, следующий очевидный шаг - прибегнуть к какой-то отложенной загрузке либо с помощью AJAX, либо с помощью iframe (не очень важно, какой из них прямо сейчас, и не в этом вопрос), но я сталкиваюсь с некоторыми трудностями. Моя идея заключалась в том, чтобы напрямую вызвать файл XML следующим образом:

file:///path/to/file/transform.xml?id=23

С transform.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<content />

И transform.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
    <xsl:output method="html" version="5" doctype-system="about:legacy-compat" indent="yes" />
    <xsl:param name="url" />

    <xsl:template match="/">
        <html>
            <body><xsl:value-of select="$url" /></body>
        </html>
    </xsl:template>
</xsl:stylesheet>

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

Все, что я вижу в этот момент, это чистая страница. Я также пытался изменить имя параметра на id, но страница остается пустой.

Я знаю, что этого можно легко добиться с помощью PHP или других серверных решений, а MySQL будет более эффективным, но мне действительно нужно, чтобы это приложение можно было использовать в тот момент, когда загрузка заканчивается. Если моим пользователям нужно будет установить сервер *AMP, они, вероятно, этого не сделают. Публичный сервер также не является решением, так как мне нужно, чтобы это приложение работало в автономном режиме. С другой стороны, решение JavaScript/jQuery вполне приемлемо, поскольку оно выполняется на стороне клиента.

Изменить: большая часть моей работы основана на этом вопросе, который, кажется, работает но он довольно старый, и пример содержит URL-адрес страницы ASP.

10.07.2017

Ответы:


1

Вызов преобразования с помощью инструкции по обработке таблицы стилей xml не предоставляет никакого способа передать параметры для преобразования. Таким образом, параметр примет значение по умолчанию, которое представляет собой строку нулевой длины.

Извините, но этот дизайн не будет летать.

Я думаю, что единственный способ сделать это - иметь код Javascript на странице HTML, который программно вызывает преобразование.

Один из вариантов — использовать Saxon-JS, а не полагаться на механизм XSLT, предоставляемый браузером. Это даст вам доступ к возможностям XSLT 2.0/3.0, а не только к 1.0, а в версии 2.0 таблица стилей может получить доступ к URI исходного документа с помощью функции document-uri().

10.07.2017
  • Проблема, которую я вижу с Saxon-JS, заключается в том, что он требует своего рода компиляции файлов XSL, что означает, что код, вероятно, станет закрытым. 10.07.2017
  • Да, зависимость от коммерческих инструментов — это фактор, который вы должны учитывать. Вам нужно решить, предпочитаете ли вы использовать коммерческие инструменты, которые активно разрабатываются в 2017 году, или бесплатные инструменты, которые не продвигались вперед с 2001 года. 11.07.2017

  • 2

    Поскольку передача параметров URL в XSL кажется непрактичной, я нашел другой способ через AJAX. Javascript импортирует файлы XML и XSL, затем фильтрует файл XML, чтобы остался только один элемент, а затем применяет файл XSL к оставшейся структуре XML.

    Для тех, кто ищет вдохновения для подобных проблем, я оставлю упрощенный пример кода, который я использую. Для этого кода требуется jQuery, но он может прекрасно работать и без него.

    page.js (бесстыдно скопировано из здесь):

    function expand_box(id, tag_to_isolate, XML_file, XSL_file, container) {
        if($('div#' + id).length == 0) { //first opening
            var XML = $.ajax({url: XML_file, async: false, dataType: 'xml'}).responseXML.activeElement;
            var XSL = $.ajax({url: XSL_file, async: false, dataType: 'xml'}).responseXML.activeElement;
            if(XSL.getElementsByTagName('xsl:include').length == 1) { //bonus, see below*
                var XSL_temp = $.ajax({url: 'templates.xsl', async: false, dataType: 'xml'}).responseXML.activeElement;
                $(XSL.getElementsByTagName('xsl:include')).replaceWith(XSL_temp.childNodes);
            }
            XML = $(XML).find(tag_to_isolate + '[id=' + id + ']')[0];
            if (window.ActiveXObject) { // code for IE
                var result = XML.transformNode(XSL);
            }
            else if (document.implementation && document.implementation.createDocument) { // code for Chrome, Firefox, Opera, etc.
                var xsltProcessor = new XSLTProcessor();
                xsltProcessor.importStylesheet(XSL);
                var result = xsltProcessor.transformToFragment(XML, document);
            }
            $('div#' + panel).append(result);
            //other code here, e.g. to apply all jQuery functions bound to clicks, ...
        }
        $('#' + id).slideDown();
    }
    

    * Бонус: я обнаружил, что javascript xsltProcessor не может обрабатывать теги xsl:include, поэтому мне пришлось импортировать их вручную. Код здесь довольно прост, потому что я использую только один xsl-файл для хранения всех общих шаблонов, поэтому замена выполняется автоматически, но ее можно легко адаптировать для большей гибкости.

    database.xml (это не тот файл XML, который показан выше):

    <?xml version="1.0" encoding="UTF-8"?>
    <elements>
        <element id="1">
            ...
        </element>
        ...
    </elements>
    

    преобразовывать.xsl:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
        <xsl:template match="/elements/element">
            ...
        </xsl:template>
        <xsl:include href="templates.xsl" />
    </xsl:stylesheet>
    

    В зависимости от используемой базы данных вы можете создать столько совпадений, сколько необходимо.

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

    16.07.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..