Я хочу передать параметр, содержащий 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...
Как я могу это сделать? Спасибо.
Если вы используете Saxon, самым простым решением является передать StreamSource в качестве значения параметра:
setParameter("foo", new StreamSource(new StringReader("<bar>baz</bar>")));
Но это может не сработать с другими процессорами: JAXP оставляет его реализацией, какие объекты могут передаваться как значения параметров.
Возможно, вы захотите проверить документацию своего 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
.