Упрощенная таблица стилей XSLT с элементом xsl:attribute-set

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

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

Я также проверил объяснение веб-сайта 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);

person stockoverflow    schedule 23.02.2011    source источник
comment
Отредактируйте сообщение, включив в него первые 10 строк таблицы стилей (используйте кнопку {} в редакторе, чтобы отформатировать код XML).   -  person Jim Garrison    schedule 23.02.2011
comment
Я добавил только первые две строки, так как они актуальны... после этого это просто цикл for-each для выбора данных.   -  person stockoverflow    schedule 23.02.2011


Ответы (3)


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

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

person Michael Kay    schedule 23.02.2011
comment
Привет, я думаю, что это более подходящий ответ. - person stockoverflow; 23.02.2011

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

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

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

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

  • ELMENT — элемент верхнего уровня.
  • Должен быть потомком ‹xsl:stylesheet> или ‹xsl:transform>
  • ELEMENT является элементом верхнего уровня и должен отображаться как дочерний узел ‹xsl:stylesheet> или ‹xsl:transform>.

пример

<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>
person Lachlan Roche    schedule 23.02.2011
comment
Я вижу, а когда вы ссылаетесь на дочерний элемент, вложенности нет? Это должен быть ближайший ребенок? - person stockoverflow; 23.02.2011
comment
На самом деле, нет, вы не можете, это должен быть ребенок, он не может быть потомком. Думаю, я напишу еще один вопрос по этому вопросу родитель-ребенок. Спасибо за помощь. - person stockoverflow; 23.02.2011

Другим способом, которым это будет работать с упрощенным синтаксисом, будет удаление 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="/" с использованием безымянного режима.

Ссылки

person Paul Sweatte    schedule 10.06.2014