2016-03-04 4 views
0

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

Это 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> 

Это 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> 

Я пытаюсь собрать его таким образом:

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

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

Вот некоторые из городов.

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

ответ

0

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

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

+0

Или просто измените тег версии на 1.0 и пространство имен соответственно. Я не вижу никакой инструкции, связанной с xslt2. –

+1

@ AydinK.'xsl: sequence' и 'xsl: значение-of @ separator' и' xsl: variable @ as' – wero

+0

Это не похоже на правильное поведение, совместимое с forwards. Когда процессор 1.0 с таблицей стилей 2.0 видит неизвестный атрибут (например, @as), он должен игнорировать его, но когда он пытается выполнить неизвестный элемент (например, xsl: sequence), он должен выдать ошибку. Хорошо, я думаю, это не будет исправлено. –

0

Просто переписать его в 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. Южная Каролина и Вирджиния: указывается, а не города.

+0

Привет всем .. Большое вам спасибо за ваши комментарии. Я использовал саксон, и это сработало. Я понял, что эта версия была проблемой! –