У нас есть какой-нибудь саксонский класс Transformer?
Мой фрагмент кода трансформации ниже:
EnterpriseConfiguration config = new EnterpriseConfiguration();
StreamResult xmlOutput = new StreamResult(new StringWriter());
Source xmlInput = new StreamSource(new StringReader(sourceMsg));
EnterpriseTransformerFactory factory = new EnterpriseTransformerFactory();
Transformer transformer = factory.newTransformer(new StreamSource(new File(xsltPath)));
System.out.println("config.isLicenseFound() " + config.isLicenseFound());
transformer.transform(xmlInput,xmlOutput);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
System.out.println("OUTPUT :::-> " + xmlOutput.getWriter().toString());
Где я использую javax.xml.transform.Transformer
класс, я хотел бы знать, есть ли какой-нибудь трансформер, специфичный для саксонцев? Если да, может предложить мне любой, заранее спасибо.
Вот код, который я пытаюсь достичь функциональности:
static HashMap<String, String> mapValues = new HashMap<String, String>();
public static HashMap<String, String> getMapValues() {
return mapValues;
}
public static void setMapValues(HashMap<String, String> mapValues) {
DecomposeXsl.mapValues = mapValues;
}
public String transformXsl() throws IOException, SaxonApiException
{
mapValues.put("John", "Jbl");
processor = new Processor(false);
xsltCompiler = processor.newXsltCompiler();
XPathCompiler xpathCompiler = new Processor(false).newXPathCompiler();
String pageFragment = null;
StreamSource xslStreamSource = new StreamSource(new File(xsltPath));
XsltExecutable xsltExecutable = xsltCompiler.compile(xslStreamSource);
xsltExecutable = xsltCompiler.compile(xslStreamSource);
pageXmlTransformer = xsltExecutable.load();
XsltTransformer transformer = null;
transformer = pageXmlTransformer;
String inputStr = null;
//StringReader inputStrReader = new StringReader(inputStr);
StreamSource xmlDoc = new StreamSource(new File(sourcePath));
Serializer serializer = new Serializer();
serializer.setOutputWriter(new StringWriter());
serializer.setOutputProperty(Serializer.Property.SAXON_STYLESHEET_VERSION, "2.0");
serializer.setOutputProperty(Serializer.Property.METHOD, "xml");
serializer.setOutputProperty(Serializer.Property.MEDIA_TYPE, "text/html");
serializer.setOutputProperty(Serializer.Property.INDENT, "no");
serializer.setOutputProperty(Serializer.Property.OMIT_XML_DECLARATION, "yes");
serializer.setOutputProperty(Serializer.Property.ENCODING, "utf-8");
transformer.setSource(xmlDoc);
transformer.setDestination(serializer);
transformer.transform();
pageFragment = serializer.getOutputDestination().toString();
System.out.println("pageFragment "+pageFragment);
return pageFragment;
}
Исключение, которое я получаю:
XTDE1425: Cannot find a matching 2-argument function named {java:java.util.Map}get().
Reflexive calls to Java methods are not available under Saxon-HE
in built-in template rule
net.sf.saxon.s9api.SaxonApiException: Cannot find a matching 2-argument function named {java:java.util.Map}get(). Reflexive calls to Java methods are not available under Saxon-HE
Вот мой код xsl:
<xsl:param name="valMap" as="java:java.util.Map" required="no" select="controller:getMapValues()"/>
<newTag><xsl:value-of select="map:get($valMap, 'John')"/></newTag>
1 ответ
Было бы легче ответить, если бы вы сказали нам, почему вы должны знать.
Буквальный ответ на ваш вопрос: да, есть класс Saxon, который реализует интерфейс JAXP Transformer. Вы можете узнать, что это такое, отображая значение transformer.getClass().getName()
, Но обычно вам не нужно знать, как называется класс, если вы не хотите достичь какого-то особого эффекта.
В приведенном выше коде, создание EnterpriseConfiguration
является избыточным, потому что вы получаете один в любом случае, когда вы создаете EnterpriseTransformerFactory
, Было бы разумнее позвонить getConfiguration()
на заводе. Если у вас есть два разных объекта Configuration, вы, вероятно, запутаетесь, когда устанавливаете свойства для одного из них, и это не имеет никакого эффекта.
И еще один комментарий к вашему коду: нет смысла устанавливать свойства вывода ПОСЛЕ выполнения преобразования: к тому времени уже слишком поздно.