Область видимости переменной XSLT с импортом - PullRequest
0 голосов
/ 06 октября 2018

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

Вот такой XML-файл, который у меня есть:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/XRCS/xrcs/template.xsl" type="text/xsl"?>
<xrcs:page id="/"
           xmlns="http://www.w3.org/1999/xhtml"
           xmlns:xrcs="xrcs:xrcs">
    <xrcs:title>XRCS Home Page</xrcs:title>
    <xrcs:content>
        Hello I am some HTML!
        <p>
            Paragraphs!
        </p>
        <h2>Headings!</h2>
        <p>
            More paragraphs!
        </p>
    </xrcs:content>
</xrcs:page>

Для начала я хотел, чтобы заголовок страницы можно было настраивать с config.xsl.Я думал, что это будет довольно просто:

  • template.xsl - фактическая таблица стилей

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:xrcs="xrcs:xrcs"
                    xmlns="http://www.w3.org/1999/xhtml">
        <xsl:import href="config.xsl" />
    
        <!-- DOCTYPE from
             https://stackoverflow.com/a/22302701/522375 -->
        <xsl:output method="xml"
                    doctype-system="about:legacy-compat" />
        <xsl:template match="/">
            <html>
                <head>
                    <title><xsl:value-of select="$site-name" /></title>
                </head>
                <body>
                    <h1><xsl:value-of select="/xrcs:page/xrcs:title" /></h1>
                    <xsl:copy-of select="/xrcs:page/xrcs:content/*" />
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
    
  • config.xsl

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:xrcs="xrcs:xrcs"
                    xmlns="http://www.w3.org/1999/xhtml">
        <!-- Global variables -->
        <xsl:variable name="site-name" select="'XRCS'" />
        <xsl:variable name="xrcs-url" select="'/XRCS/xrcs'" />
    
        <!-- Extensions -->
        <xsl:import href="extensions/core.xsl" />
        <xsl:import href="extensions/include.xsl" />
        <xsl:import href="extensions/citations.xsl" />
    </xsl:stylesheet>
    
  • extensions/* - это всего лишь пустой элемент <xsl:stylesheet>.

Конечно, теперь я знаю, что $xrcs-url почти бесполезен, поскольку импорт оценивается перед переменными,Однако Firefox жалуется на некоторую неопределенную ошибку при попытке использовать эту таблицу стилей.

Эта таблица стилей (где я заменил импорт определением переменной), с другой стороны, работает нормально:

  • template.xsl - фактическая таблица стилей

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:xrcs="xrcs:xrcs"
                    xmlns="http://www.w3.org/1999/xhtml">
        <xsl:variable name="site-name" select="'XRCS'" />
    
        <!-- DOCTYPE from
             https://stackoverflow.com/a/22302701/522375 -->
        <xsl:output method="xml"
                    doctype-system="about:legacy-compat" />
        <xsl:template match="/">
            <html>
                <head>
                    <title><xsl:value-of select="$site-name" /></title>
                </head>
                <body>
                    <h1><xsl:value-of select="/xrcs:page/xrcs:title" /></h1>
                    <xsl:copy-of select="/xrcs:page/xrcs:content/*" />
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
    

Почему?!

Единственное объяснение, которое я имеюдо сих пор придумали, что переменные зависят от файла.Если это так, я буду очень, очень раздражен, но я полагаю, я мог бы определить еще одну схему для конфигурации, чтобы жить в ней, и использовать эту переменную $xrcs-url после всех ...

Правильно ли мое предположение?Эти переменные зависят от файла?Я не нашел никакой документации по этому вопросу, и спецификация XSLT - это спецификация W3 (трудно читаемая, если вы уже не очень хорошо понимаете ее), поэтому там нет никакой помощи.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

<xsl:import /> должно предшествовать любому другому дочернему элементу <xsl:stylesheet />.Это была прямая причина ошибки, которую я получил.

Я принимаю ответ Майкла Кея, потому что он действительно говорит об этом, хотя я пропустил это и потратил несколько дней, пытаясь выяснить это сам!

0 голосов
/ 06 октября 2018

Область действия глобальных (верхнего уровня) переменных, а также других именованных объявлений, таких как именованные шаблоны, представляет собой целую таблицу стилей, то есть все модули.Когда модуль A импортирует модуль B, оба модуля могут объявить переменную V, и объявление V в A используется везде, в том числе и в B (на языке спецификации A имеет более высокий приоритет импорта).

Если вы пытаетесь написать что-то амбициозное в XSLT, то я бы рекомендовал настойчивый с пониманием спецификации.Или вы можете предпочесть мою книгу Справочник программиста XSLT от Wrox / Wiley - но она охватывает XSLT 2.0, а не 1.0, если вы не можете найти более старую версию.

У меня проблемы с пониманием того, чтоВы имеете в виду «Конечно, теперь я знаю, что $ xrcs-url почти бесполезен, поскольку импорт оценивается перед переменными».Импорт не «оценивается», это объявления, используемые для построения таблицы стилей во время компиляции.Я не знаю, для чего вы хотите использовать $ xrcs-url (ваш код, по-видимому, не пытается его использовать), в принципе он кажется вполне пригодным для использования, хотя, возможно, не тем, для чего вы его предназначали (но я не знаю,для чего, конечно, вы это и предполагали).

Кстати, здесь есть одна таблица стилей с двумя модулями: она помогает правильно понять терминологию.

Затем вы говорите: «Однако Firefox жалуется накакая-то неуказанная ошибка при попытке использовать эту таблицу стилей. "Ну, это, вероятно, жалуется, что объявления xsl: import находятся не в том месте.Но, что более важно, запуск кода XSLT в браузере не является хорошим подходом для разработки и тестирования.Диагностика паршивая.Гораздо более продуктивно (вы говорите, что вы амбициозны) использовать специализированную IDE, такую ​​как oXygen.

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