Обработка XSLT с Java: передача содержимого XML в параметре

1

Я хочу передать параметр, содержащий 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...

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

  • 0
    Почему вы не удаляете теги перед передачей параметра?
  • 0
    Вам необходимо создать проанализированный XML-документ и затем передать его как значение параметра, а не строку, которую вы сейчас передаете. Прочтите документацию по вашему процессору XSLT, как поддерживается передача параметров типа XMLDocument.
Показать ещё 2 комментария
Теги:
xslt

2 ответа

6

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

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

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

2

Возможно, вы захотите проверить документацию своего XSLT-процессора, какие типы параметров он позволяет, и как и как он может передать node, а не строку. Если я правильно понимаю 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.

  • 0
    Хорошо, спасибо, посмотрим на это, потому что я хотел бы передать xml, чтобы иметь возможность выбирать узлы в XSL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню