Странная ошибка в XSLT 2.0 [SXXP0003] - PullRequest
0 голосов
/ 19 апреля 2011

В последний день я имел дело с 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 #, которую я хочу проанализировать до конца. каждая запись отделяется ^.

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 апреля 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
1 голос
/ 19 апреля 2011

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

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

Скорее всего, файл "A2.blm" не найден или не доступен -- проверьте хорошо .

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

Из XSLT 2.0 W3C spec :

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

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

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

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

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

<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>
...