Обработка XSLT с Java: передача содержимого XML в параметре - PullRequest
1 голос
/ 02 февраля 2012

Я хотел бы передать параметр, содержащий XML содержимое при обработке XSLT .Вот мой код:

import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

File xmlFile = new File(xmlFilePath);
File xsltFile = new File(xslFilePath);
Source xmlSource = new StreamSource(xmlFile);
Result result = new StreamResult(System.out);

TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.setParameter("foo", "<bar>Hello1</bar><bar>Hello2</bar>");
trans.transform(xmlSource, result);

Затем я хотел бы выбрать значения, содержащиеся в теге 'bar' в моем XSL-файле.

<xsl:param name="foo"/>
...
<xsl:value-of select="$foo//foo[1]" />

Но это не работает, Я получаю это сообщение об ошибке:

org.apache.xpath.objects.XString cannot be cast to org.apache.xpath.objects.XNodeSet

Итак, я думаю, мне следует передать объект XML в мой метод setParameter, но какой именно?Я не могу найти простой пример, как создать объект XNodeSet ...

Как я могу это сделать?Спасибо.

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Если вы используете Saxon, самое простое решение - передать StreamSource в качестве значения параметра:

setParameter("foo", new StreamSource(new StringReader("<bar>baz</bar>")));

Но это может не сработать с другими процессорами: JAXP оставляет его определяемым реализацией, какие типы объектов могут передаваться в качестве значений параметров.

2 голосов
/ 02 февраля 2012

Возможно, вы захотите проверить документацию вашего процессора XSLT, какие типы параметров он разрешает и позволяет ли он передавать в узле, а не в строке.Если я правильно понимаю http://www.saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html и http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/jaxp/TransformerImpl.html#setParameter(java.lang.String,%20java.lang.Object), то Saxon позволяет передавать узлы в виде его NodeInfo.

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