2013-05-24 7 views
3

XSLT 2.0 XSL: Значение- из элемента, как представляется, не будет работать с помощью встроенного в Java 1.7 процессора XSLT сепаратор атрибута , Вот пример (слегка отредактированный из главы 4 XSLT 2nd ed. для уменьшения размера):XSLT 2.0 XSL: Значение-сепаратор атрибута не работает в Java 1.7 с apache.xalan

XML файл

<?xml version="1.0" encoding="utf-8"?> 
<cars> 
    <manufacturer name="Chevrolet"> 
    </manufacturer> 
    <manufacturer name="Ford"> 
    </manufacturer> 
    <manufacturer name="Volkswagen"> 
    </manufacturer> 
</cars> 

XSLT-файл

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="cars/manufacturer/@name" separator=", "/> 
    </xsl:template> 
</xsl:stylesheet> 

Java код

import javax.xml.transform.*; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 

public class FooMain { 
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException { 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     System.out.println("transformer factory class: "+factory.getClass()); // line-a 
     Source xslt = new StreamSource(new File("transform.xslt")); 
     Transformer transformer = factory.newTransformer(xslt);                                          
     Source text = new StreamSource(new File("input.xml")); 
     transformer.transform(text, new StreamResult(new File("output.html"))); 
    } 
} 

Когда код работает, он создает следующий выходной файл:

Chevrolet 

... в отличие от того, что книга описывает:

Chevrolet, Ford, Volkswagen 

Я использую Java 1.7 в Ubuntu Precise и имя класса в TransformerFactory экземпляр сообщается (в линии-а кода Java выше), как:

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 

UPDATE

Я экспериментировал и переименовал атрибут в файле XSLT в separatorBOO, и код продолжает работать без жалоб и дает тот же самый результат. Таким образом, казалось бы, атрибут XSLT 2.0 не распознается вообще?

ответ

4

Вы должны предоставить другой завод, поскольку Xalan не поддерживает преобразования xslt2. Попробуйте использовать саксон. Я думаю, вам нужно только сбросить банку в свой путь к классам, поскольку Java использует встроенную версию, если в пути к классам нет провайдера.

+1

Yeap, поместив saxon9he.jar в runtime classpath, сделал трюк –

+0

- это саксон, единственный lib, который поддерживает преобразования xslt2 ?? – frewper