XSLT: Как запустить шаблон, когда нет входного файла? - PullRequest
3 голосов
/ 03 августа 2009

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

Я бы хотел иметь возможность запустить:

xsltproc --stringparam bar baz foo.xsl

Но сейчас мне нужно запустить с «основным» шаблоном соответствия «/»:

echo '<xml/>' | xsltproc --stringparam bar baz foo.xsl -

Как мне заставить это работать? Я уверен, что видел в прошлом другие шаблоны, которые должны были работать без входного документа, но я не помню, как они работали или где их снова найти. : -)

Ответы [ 2 ]

9 голосов
/ 16 августа 2009

На самом деле, это было сделано довольно часто.

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

В XSLT 1.0 можно предоставить для преобразования свой собственный первичный модуль (файл) стилей в качестве исходного XML-документа, и, конечно, преобразование может полностью игнорировать этот исходный XML документ. Эта техника давно была продемонстрирована и использована Джени Теннисон .

Например:

<?xml-stylesheet type="text/xsl" href="example.xml"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <p>Hello, world!</p>
    </xsl:template>
</xsl:stylesheet>

Когда указанный выше код сохраняется в файле с именем «example.xml», а затем содержимое папки отображается в проводнике Windows, двойной щелчок по файлу «example.xml» откроет IE и выдаст:

Привет, мир!

1 голос
/ 04 августа 2009

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

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

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