Как преобразовать каждый XML-узел с помощью Saxon XSLT? - PullRequest
0 голосов
/ 16 мая 2018

Как я могу использовать Saxon библиотеку преобразования xslt для преобразования XML-файла, который содержит много узлов, в простую строку csv? Значит, я хочу, чтобы Саксон конкатенировал каждую запись employee как csv и соединил их все вместе.

Это настройка саксона, но я не знаю, как я не смог преобразовать входной XML-файл с ним:

    //false = does not required a feature from a licensed version of Saxon.
    Processor processor = new Processor(false);

    XsltCompiler compiler = processor.newXsltCompiler();
    compiler.compile(new StreamSource("transformation.xslt"));

    Serializer serializer = processor.newSerializer();
    serializer.setOutputProperty(Serializer.Property.OMIT_XML_DECLARATION, "yes");

    //TODO 
    //String result = serializer...serializeNodeToString();

Я хочу преобразовать следующий xml:

<employees stage="test">
   <employee>
      <details>
         <name>Joe</name>
         <age>34</age>
      </details>
      <address>
         <street>test</street>
         <nr>12</nr>
      </address>
   </employee>
   <employee>
      <address>....</address>
      <details>
         <!-- note the changed order of elements! -->
         <age>24</age>
         <name>Sam</name>
      </details>
   </employee>
</employees>

Строка result должна содержать следующее (одна большая строка с csv-строками, разделенными переносом строк):

test,Joe,34,test,12\n
test,Sam,24,...\n

Xslt может быть похож на:

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="employee">
    <xsl:value-of select="name"/>
    <xsl:value-of select="age"/>
  </xsl:template>
</xsl:transform>

1 Ответ

0 голосов
/ 17 мая 2018

Шаблон XSLT можно изменить, как показано ниже. Элементы могут быть выбраны в соответствии с требуемой последовательностью.

<xsl:template match="employee">
    <xsl:value-of select="ancestor::employees/@stage, details/name, details/age, address/street, address/nr" separator=", " />
    <xsl:text>&#xA;</xsl:text>
</xsl:template>

После замены ... на некоторые фиктивные значения в элементе <address> генерируется следующий вывод с использованием вышеуказанного шаблона.

test, Joe, 34, test, 12
test, Sam, 24, test1, 123

Для преобразования XML (с использованием XSLT) в Java большую часть времени я использую следующий фрагмент кода. Этот метод возвращает преобразованный XML как String. Требуемая библиотека saxon9he.jar. Возможно, вам придется обновить версию библиотеки для использования с XSLT 3.0

public static String transformXML(String xml, InputStream xslFile) {
    String outputXML = null;
    try {
        System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(xslFile));
        Source xmlStream = new StreamSource(new StringReader(xml));
        StringWriter writer = new StringWriter();
        Result result = new StreamResult(writer);
        transformer.transform(xmlStream, result);
        outputXML = writer.getBuffer().toString();
    } catch (TransformerConfigurationException tce) {
        tce.printStackTrace();
    } catch (TransformerException te) {
        te.printStackTrace();
    }
    return outputXML;
}
...