Странная ошибка в XSLT 2.0 [SXXP0003]

В последний день я имел дело с XSLT 2.0, пытаясь разобрать обычный текстовый файл. по-видимому, я даже не смог добраться до той части, где я действительно заработал, на данный момент xsl не нужно что-то делать, просто правильно загрузиться в процессор saxonb-xslt.

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"  version="2.0">

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

<xsl:template match='/'>
<add_adverts>
<Body>
<Envelope>
<Advert>
<xsl:for-each select="tokenize(unparsed-text('A2.blm'), '\r?\n')">
 <fff>?</fff>
</xsl:for-each>
</Advert>
</Envelope>
</Body>
</add_adverts>  
</xsl:template>

</xsl:stylesheet>

Как я это запускаю:

saxonb-xslt -s:A2.blm -xsl:eraxsl.xsl -o:test.xml

файл blm представляет собой обычный текстовый файл, первая строка: #HEADER# последняя строка #END# в ней есть строка с именем #DATA#, которую я хочу разобрать до конца. каждая запись отделена знаком ^.

Спасибо,


person snoofkin    schedule 19.04.2011    source источник
comment
Вы передаете текстовый файл в качестве источника ввода в командной строке?   -  person    schedule 19.04.2011
comment
Хотите предоставить минимальные, но полные образцы, позволяющие нам легко воспроизвести проблему? Какая именно версия Saxon?   -  person Martin Honnen    schedule 19.04.2011
comment
Смотрите мой ответ для полного решения. Ваша проблема заключается в том, что относительный URI не может быть успешно разрешен — файл должен находиться в том же каталоге, что и таблица стилей XSLT. Или вам нужно указать абсолютный URI.   -  person Dimitre Novatchev    schedule 19.04.2011


Ответы (2)


Я вообще не воспроизводил эту проблему — я создал файл "A2.blm" в том же каталоге, что и таблица стилей XSLT. Преобразование работает должным образом.

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

Вероятнее всего, файл "A2.blm" не найден или к нему невозможно получить доступ – хорошо проверьте.

Чтобы этот файл можно было найти, он должен находиться в том же каталоге, что и ваш файл таблицы стилей.

Из спецификации XSLT 2.0 W3C:

«Функция unparsed-text считывает внешний ресурс (например, файл) и возвращает его содержимое в виде строки.

Аргумент $href должен быть строкой в ​​форме URI. URI не должен содержать идентификатор фрагмента и должен идентифицировать ресурс, который может быть прочитан как текст. Если URI является относительным URI, то он разрешается относительно базового URI из статического контекста. "

И, самое главное:

"Примечание. Если подходит другой базовый URI (например, при разрешении относительного URI, считанного из исходного документа), то относительный URI следует разрешить с помощью функции разрешения-uriFO, прежде чем передавать его в функцию неанализируемого текста. ."

Вот доказательство того, что остальная часть вашего преобразования работает так, как задумано:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"  version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match='/'>
        <add_adverts>
            <Body>
                <Envelope>
                    <Advert>
                        <xsl:for-each select="tokenize(., '\r?\n')">
                            <fff>?</fff>
                        </xsl:for-each>
                    </Advert>
                </Envelope>
            </Body>
        </add_adverts>
    </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к данному XML-документу:

<t>1&#xA;2&#xD;&#xA;3&#xA;</t>

получен желаемый правильный результат:

<add_adverts xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
   <Body>
      <Envelope>
         <Advert>
            <fff>?</fff>
            <fff>?</fff>
            <fff>?</fff>
            <fff>?</fff>
         </Advert>
      </Envelope>
   </Body>
</add_adverts>
person Dimitre Novatchev    schedule 19.04.2011
comment
Опять удивительный ответ. Кстати, должен ли мой входной файл (тот, который я хочу преобразовать в XML) иметь теги (в вашем примере ‹t›...‹/t›), нельзя ли использовать XSLT для преобразования обычных текстовых файлов в XML? - person snoofkin; 20.04.2011
comment
Вы можете использовать что угодно — я обычно использую <t/>. Или вы можете указать в командной строке исходное имя шаблона (проверьте синтаксис), и в этом случае вы вообще не указываете исходный XML-файл. - person Dimitre Novatchev; 20.04.2011

Параметр -s: для saxon-xslt указывает исходный документ, который, я думаю, должен быть в формате xml. В вашем примере вам не нужен этот источник, так как вы указываете имя файла в своем шаблоне. Решением будет удаление исходного параметра и указание именованного шаблона вместо совпадения в качестве отправной точки:

<xsl:template name="main">
    <add_adverts>...<add_adverts>
</xsl:template>


saxonb-xslt -xsl:eraxsl.xsl -o:test.xml -it:main
person Jörn Horstmann    schedule 19.04.2011