2014-01-20 2 views
0

Прямо сейчас я использую это Java (который принимает один параметр файла XML) метод для выполнения преобразования XSLT:Преобразование нескольких входных файлов

static public byte[] simpleTransform(byte[] sourcebytes, int ref_id) { 
    try { 
     StreamSource xmlSource = new StreamSource(new ByteArrayInputStream(sourcebytes)); 
     StringWriter writer = new StringWriter(); 
     transformations_list.get(ref_id).transformer.transform(xmlSource, new StreamResult(writer)); 
     return writer.toString().getBytes("UTF-8"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return new byte[0]; 
    } 
} 

И в моем файле XSLT Я использую document('f2.xml') ссылаться на другие преобразовывать связанные файлы.

Я хочу использовать Java, как это (получить несколько файлов XML):

static public byte[] simpleTransform(byte[] f1, byte[] f2, byte[] f3, int ref_id) 

в моей XSLT я не хочу называть document('f2.xml') но ссылаться на объект, используя f2, полученные в моей Java метод.

Есть ли способ сделать это? как я могу обратиться к

f2.xml

в моем XSLT, используя этот способ?

+0

@Erwin: Благодарим за улучшение отпечатка и публикации! Но, пожалуйста, не редактируйте ошибки в коде. Это то, что вы должны указать в комментарии или ответе. –

ответ

1

Я не совсем уверен, что есть в f1, f2 и т. Д. Это URL-адрес документа? или самого документа XML-документа?

Существует два возможных подхода, которые вы могли бы рассмотреть.

Первый - написать URIResolver. Когда вы вызываете документ («f2.xml»), Saxon будет вызывать ваш URIResolver, чтобы получить соответствующий документ в качестве объекта Source. Ваш URIResolver может вернуть StreamSource, инициализированный с помощью ByteArrayInputStream, ссылаясь на соответствующее значение btye [].

Второй подход - предоставить документы в качестве параметров в таблицу стилей. Вы можете объявить глобальный параметр <xsl:param name="f2" as="document-node()"/>, а затем использовать Transfomer.setParameter() для подачи фактического документа; в таблице стилей, замените document('f2.xml') на $f2. Saxon примет объект Source как значение, заданное параметру setParameter, поэтому вы можете снова создать StreamSource, инициализированный с помощью ByteArrayInputStream, ссылаясь на соответствующее значение btye []; альтернативно (и, возможно, лучше), вы можете предварительно построить дерево, вызвав Saxon DocumentBuilder.

+0

дает ошибку проверки xml: Атрибут «как» не разрешен для отображения в xsl: param –

+0

Я склонен предположить, что люди, использующие саксон, используют XSLT 2.0. Эта ошибка говорит о том, что вы используете XSLT 1.0. (Я предполагаю, что вы используете Saxon, потому что вы поставили тег «saxon» на ваш вопрос.) Время для обновления! –