Упрощенная таблица стилей XSLT с элементом xsl: attribute-set - PullRequest
2 голосов
/ 23 февраля 2011

Я пытаюсь использовать <xsl:attribute-set> в своем документе xsl, но продолжаю получать сообщения об ошибках:

  • ошибка компиляции: набор атрибутов элемента строки 47
  • атрибут элемента-set разрешен только как дочерний элемент таблицы стилей

Я также проверил объяснение на веб-сайте W3Schools по наборам атрибутов XSLT и обнаружил, что:

Must be child of <xsl:stylesheet> or <xsl:transform>.

Я не понимаю, что это значит, кто-нибудь может объяснить?

Если вам нужна дополнительная информация о моих документах, установите сервер WAMP, пожалуйста, прокомментируйте ниже.

Первые две строки моего XSLдокумент:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

Я понятия не имею, что они делают, просто без него мой XSL не будет работать.

Я в основном преобразую свой XML в HTML, используя этот файл XSL.Весь процесс выполняется PHP:

# START XSLT
$xslt = new XSLTProcessor(); 
$XSL = new DOMDocument(); 
$XSL->load('hello.xsl'); 
$xslt->importStylesheet($XSL); 

# LOAD XML FILE 
$XML = new DOMDocument();
$XML->load('hello.xml');

#PRINT 
print $xslt->transformToXML($XML);

Ответы [ 3 ]

2 голосов
/ 23 февраля 2011

Вы используете очень редко встречающийся "буквальный элемент результата в качестве таблицы стилей" , также известный как "упрощенная таблица стилей", в которой элемент xsl:stylesheet и самый внешний xsl:template являются неявными , Ваша проблема иллюстрирует, почему это средство используется так редко - оно быстро истощается. Поскольку нет элемента xsl:stylesheet, ни один из обычных потомков xsl:stylesheet не может присутствовать, и это включает объявления наборов атрибутов.

Измените свой код, чтобы обернуть его в явные xsl:stylesheet и xsl:template match="/". Затем добавьте xsl:attribute-set на том же уровне, что и xsl:template.

1 голос
/ 23 февраля 2011

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

xsl:attribute-set должен быть дочерним элементом вашего xsl:stylesheet элемента, который является корневым элементом XSLT.Это то же самое, что и для xsl:output или xsl:template.

Стандарт описывает эти элементы как находящиеся в категории «элемент верхнего уровня».

w3schools.com говорит об этом несколькими способами:

  • Элемент ELMENT является элементом верхнего уровня.
  • Должен быть дочерним по отношению кили же
  • ELEMENT является элементом верхнего уровня и должен отображаться как дочерний узелили же

пример

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:attribute-set name="body-attr">
        <xsl:attribute name="color">red</xsl:attribute>
    </xsl:attribute-set>

    <xsl:template match="/">
        <xsl:element name="result" use-attribute-sets="body-attr">
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
0 голосов
/ 10 июня 2014

Другой способ работы с упрощенным синтаксисом заключается в удалении xmlns из тега html, а затем встраивании исходного файла с помощью функции document:

<?xml version="1.0" encoding="UTF-8"?>
 <section
  xsl:version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns=""
 >

    <blockquote>
        <xsl:for-each select="document('movies.xml')//processing-instruction()[contains(., '2014')]">
            <p><xsl:value-of select="concat( local-name(),' ', current() )"/></p>

            <a href="{substring-before(document('movies.xml')//processing-instruction(),',')}">
                <input type="button" value="Stream {local-name()}"/>
            </a>

            <a href="{substring-after(document('movies.xml')//processing-instruction(),',')}">
                <input type="button" value="{local-name()} Soundtrack"/>                    
            </a>

        </xsl:for-each>            
    </blockquote>

 </section>

Затем включите его:

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
    <include href="simple.xsl"/>
    <attribute-set name="foo"></attribute-set>
    <apply-templates/>
</stylesheet>

В свою очередь это означает, что единственный полезный способ инициировать преобразование - предоставить узел документа в качестве начального выбора совпадения, который должен соответствовать неявному шаблону match = "/"правило с использованием безымянного режима.

Ссылки

...