Вывод XSLT не отображается

Я новичок в XSLT. Я пытаюсь создать текстовый файл из XSLT. Когда я запускаю XSLT для входного XML с помощью синтаксического анализатора XALAN, текстовый файл генерируется без вывода.

Это XSLT

<xsl:stylesheet version="2.0"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" />

<xsl:template match="/">
    <xsl:variable name="cities" as="xs:string*">
         <xsl:sequence select="addressbook/address/city" />
         <xsl:sequence select="'Virginia'" />
    </xsl:variable>
    <xsl:text>These are some of the cities:&#xA;&#xA;</xsl:text>
    <xsl:value-of select="$cities" separator="&#xA;" />
</xsl:template>

This is the XML

<?xml version="1.0" ?>
<addressbook>
 <address>
    <name>Peter Thompson</name>
    <stree>3456 South Blvd.</stree>
    <city>Chicago</city>
    <state>IL</state>
    <zip-code>34678</zip-code>
 </address>

 <address>
    <name>Jason Thompson</name>
    <stree>3456 Fort Main</stree>
    <city>South Carolina</city>
    <state>NC</state>
    <zip-code>67878</zip-code>
 </address>

I try to compile it in this way:

java -classpath ~/Downloads/xalan/xalan.jar org.apache.xalan.xslt.Process -in cities.xml -xsl cities.xsl -out citiesop.txt

Файл cities.txt генерируется только с выводом:

Это некоторые города.

Пожалуйста, помогите мне понять, что здесь не так.


person kumark k    schedule 04.03.2016    source источник


Ответы (2)


Xalan поддерживает только XSLT 1.0. Из-за version="2.0" он использует упрощенные правила проверки синтаксиса и просто игнорирует элементы <xsl:sequence>. Поэтому ваша переменная cities пуста.

Для этой таблицы стилей вам нужно использовать движок XSLT 2.0, например Saxon.

person wero    schedule 04.03.2016
comment
Или просто измените тег версии на 1.0 и пространство имен соответственно. Я не вижу там какой-либо инструкции для xslt2 - person Aydin K.; 04.03.2016
comment
@АйдинК.xsl:sequence и xsl:value-of@separator и xsl:variable@as - person wero; 04.03.2016
comment
Это не кажется правильным поведением с прямой совместимостью. Когда процессор 1.0, использующий таблицу стилей 2.0, видит неизвестный атрибут (например, @as), он должен игнорировать его, но когда он пытается выполнить неизвестный элемент (например, xsl:sequence), он должен выдать ошибку. Ну, я думаю, это не будет исправлено. - person Michael Kay; 04.03.2016

Просто перепишите его в XSLT 1.0:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" />

<xsl:template match="/">
    <xsl:text>These are some of the cities:&#xA;&#xA;</xsl:text>
    <xsl:for-each select="addressbook/address/city" >
        <xsl:value-of select="."/>
        <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
    <xsl:text>Virginia</xsl:text>
</xsl:template>

</xsl:stylesheet>

P.S. Южная Каролина и Вирджиния – это штаты, а не города.

person michael.hor257k    schedule 04.03.2016
comment
Привет всем .. Большое спасибо за ваши комментарии. Я использовал Saxon, и это сработало. Я так понял, что дело было в версии! - person kumark k; 18.03.2016