Я новичок в XML, XSLT и javax.xml.
В настоящее время моя цель состоит в том, чтобы объединить два файла XML с помощью XSLT версии 1.0, и все работает нормально.
Но я чувствую, что в моем коде есть ограничение, и я хотел бы избавиться от него, если это возможно.
Это мои ресурсы: 'file1.xml' 'file2.xml' 'merge.xslt'
Это мой метод слияния:
public ByteArrayOutputStream merge(final InputStream file1) {
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = tFactory.newTransformer(new StreamSource("merge.xslt"));
transformer.transform(new StreamSource(file1), new StreamResult(outputStream));
} catch (final TransformerConfigurationException e) {
LOG.warn("Problem occurred transforming files configuration issue", e);
} catch (final TransformerException e) {
LOG.warn("Problem occurred transforming files", e);
}
return outputStream;
}
Вот как я передаю файл2.xml внутри XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="lookup" select="document('/file2.xml')"/>
<xsl:template match="/">
Do the processing how I want
</xsl:template>
</xsl:stylesheet>
Чего я хочу добиться, так это того, что я хотел бы изменить свой метод слияния, чтобы передать файлы file1.xml и file2.xml.
public ByteArrayOutputStream merge(final InputStream file1,final InputStream file2)
И я хочу как-то передать этот файл InputStream2 в XSLT, чтобы снять ограничение на чтение файла из файловой системы.
Может ли кто-нибудь помочь мне, если это возможно и как этого достичь, я был бы очень признателен за всю помощь.
Спасибо.
Я попробовал небольшой пример, упомянутый здесь XSLT Processing with Java: xml в параметре Но у меня это не сработало.
final InputStream file1 = new FileInputStream("file1.xml");
final InputStream file2 = new FileInputStream("file2.xml");
final TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer;
transformer = tFactory.newTransformer(new StreamSource("merge.xslt"));
transformer.setParameter("lookup", new StreamSource(file2));
transformer.transform(new StreamSource(file1), new StreamResult(new FileOutputStream("test.xml")));
И обновил XSLT следующим образом:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="lookup"/>
<xsl:template match="/">
Do the processing how I want
</xsl:template>
</xsl:stylesheet>
Ошибка, которую я получаю, выглядит следующим образом:
ERROR: 'Invalid conversion from 'javax.xml.transform.stream.StreamSource' to 'node-set'.'
Exception in thread "main" javax.xml.transform.TransformerException: java.lang.RuntimeException: Invalid conversion from 'javax.xml.transform.stream.StreamSource' to 'node-set'.
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:755)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:359)
Также используя:
<xsl:param name="lookup"/>
Получу ли я доступ к файлу file2.xml внутри XSLT.
UriResolver
. Когда он определен, он будет служить триггером, вызываемым всякий раз, когда системе необходимо разрешить ссылкуdocument()
. В этот момент вы можете просто передать любой входной поток, в который включен ваш документ. - person Marcus Rickert   schedule 02.10.2014StreamInput
реализуют интерфейсSource
. Поэтому, если у вас есть XML-документ, который нужно включить в поток, вы просто передаете этот экземпляр класса потока обратно вUriResolver
, который вы зарегистрировали в своем классе обработки XSLT. - person Marcus Rickert   schedule 02.10.2014