У нас есть какой-нибудь саксонский класс 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, вы, вероятно, запутаетесь, когда устанавливаете свойства для одного из них, и это не имеет никакого эффекта.

И еще один комментарий к вашему коду: нет смысла устанавливать свойства вывода ПОСЛЕ выполнения преобразования: к тому времени уже слишком поздно.

Другие вопросы по тегам