Мне нужно сделать XSLT-преобразование, используя несколько источников, чтобы получить один XML-файл.
Например: у меня есть сообщение XML для преобразования, файл XSL для преобразования и фрагмент документа, импортированный файлом XSL.
Если я использую только один documentFragment, он работает. По этой ссылке:
... StringURIResolver
отлично работает. Но это работает только для одной инъекции фрагмента документа (используя только ОДНУ функцию document()
на XSL в качестве примера ссылки). Следуя коду ссылки в качестве примера, я внес в него некоторые изменения для поддержки множественных инъекций:
public final class StringURIResolver implements URIResolver {
Map<String, String> documents = new HashMap<String, String>();
public StringURIResolver put(final String href, final String document) {
documents.put(href, document);
return this;
}
public StringURIResolver put(HashMap<String, String> parameterMap) {
// Make a set from Map.
Set<Entry<String, String>> mapSet = parameterMap.entrySet();
// Get the Map Iterator
Iterator<Entry<String, String>> i = mapSet.iterator();
while (i.hasNext()) {
Map.Entry<String, String> mappedValue = (Map.Entry<String, String>) i.next();
documents.put(mappedValue.getKey().toString(), mappedValue.getValue().toString());
}
return this;
}
public Source resolve(final String href, final String base) throws TransformerException {
System.out.println("RESOLVE WAS CALLED");
final String s = documents.get(href);
if (s != null) {
return new StreamSource(new StringReader(s));
}
return null;
}
}
Моя проблема здесь проста, метод StringResolver.resolve()
вызывается только ОДИН раз для всего моего XSL-файла.
Фрагмент моего XSL выглядит так:
<xsl:variable name="Test.reply" select="document('Test.reply')" />
<xsl:variable name="Test.reply2" select="document('Test.reply2')" />
<xsl:variable name="Test.reply3" select="document('Test.reply3')" />
В моем тесте JUnit, когда происходит преобразование, только один раз вызывается разрешение, сообщение «RESOLVE WAS CALLED» печатается ОДИН РАЗ, а второй и третий фрагменты не используются.
Я использую Saxon9 Transformer со следующим кодом:
private static TransformerFactory getConfiguredTransformerFactory() {
// Used to define the Default XML Transformer to SAXON 9.
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
TransformerFactory transformerFactory = new TransformerFactoryImpl();
return transformerFactory;
}
Пожалуйста, если у кого-то есть решение, позволяющее вызывать URIResolver.resolve()
для КАЖДОЙ функции document()
XSL, или новый способ объединения нескольких строковых XML-файлов с одним, используемым для преобразования, я буду признателен.