Статьи

XSL-трансформация в Java: легкий путь

XSL-преобразование (XSLT) — это мощный механизм для преобразования одного XML-документа в другой. Однако в Java манипуляции с XML довольно многословны и сложны. Даже для простого XSL-преобразования вам нужно написать несколько десятков строк кода — и, может быть, даже больше, если требуется правильная обработка исключений и ведение журнала. jcabi-xml — это небольшая библиотека с открытым исходным кодом, которая значительно упрощает жизнь, позволяя выполнять синтаксический анализ XML и обход XPath с помощью нескольких простых методов . Давайте посмотрим, как эта библиотека помогает в XSL-преобразованиях.

Сначала взглянем на практический пример — rultor.com — размещенный помощник DevOps, который автоматизирует операции выпуска, слияния и развертывания. Rultor сохраняет каждый сеанс разговора с конечным пользователем (он же «разговор») в записи DynamoDB. Есть несколько ситуаций, чтобы справиться в каждом разговоре; поэтому использование нескольких столбцов записи нереально. Вместо этого мы сохраняем только несколько параметров каждого выступления в столбцах записи (например, идентификатор и имя) и помещаем все остальные в один столбец XML.

Примерно так выглядит наша таблица DynamoDB:

01
02
03
04
05
06
07
08
09
10
11
12
13
+----+---------------+--------------------------------------+
| id | name          | xml                                  |
+----+---------------+--------------------------------------+
| 12 | jcabi-xml#54  | <?xml version='1.0'?>                |
|    |               | <talk public="true">                 |
|    |               |   <request id="e5f4b3">...</request> |
|    |               | </talk>                              |
+----+---------------+--------------------------------------+
| 13 | jcabi-email#2 | <?xml version='1.0'?>                |
|    |               | <talk public="true">                 |
|    |               |   <daemon id="f787fe">...</daemon>   |
|    |               | </talk>                              |
+----+---------------+--------------------------------------+

Когда пользователь @rultor status в @rultor status Github, Rultor должен предоставить полный отчет о состоянии текущего разговора. Чтобы создать такой текстовый ответ (обычный пользователь не оценит XML-ответ), мы должны извлечь этот столбец xml из необходимой записи DynamoDB и преобразовать его в простой текст на английском языке.

Вот как мы это делаем с помощью jcabi-xml и его класса XSLDocument .

1
2
3
4
5
final String xml = // comes from DynamoDB
final XSL xsl = new XSLDocument(
  this.getClass().getResourceAsStream("status.xsl")
);
final String text = xsl.applyTo(xml);

Вот и все. Теперь давайте посмотрим, что находится в этом файле status.xsl (это всего лишь его скелет; полная версия здесь ):

01
02
03
04
05
06
07
08
09
10
11
12
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"/>
  <xsl:template match="/talk">
    <xsl:text>Hi, here is your status report:</xsl:text>
    ...
  </xsl:template>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Хорошей практикой является создание XSL-документов только один раз за запуск приложения. У нас есть статический служебный метод XSLDocument.make() для этого:

1
2
3
4
5
6
7
8
final class Foo {
  private static final XSL STYLESHEET = XSLDocument.make(
    Foo.class.getResourceAsStream("stylesheet.xsl")
  );
  public XML style(final XML xml) {
    return Foo.STYLESHEET.transform(xml);
  }
}

Обратите внимание на то, что мы используем XSLT 2.0. Встроенная Java-реализация XSLT не поддерживает версию 2.0, и для того, чтобы она работала, мы используем две зависимости Maven Saxon:

01
02
03
04
05
06
07
08
09
10
11
12
13
<dependency>
  <groupId>net.sourceforge.saxon</groupId>
  <artifactId>saxon</artifactId>
  <version>9.1.0.8</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>net.sourceforge.saxon</groupId>
  <artifactId>saxon</artifactId>
  <version>9.1.0.8</version>
  <classifier>xpath</classifier>
  <scope>runtime</scope>
</dependency>

Все, что вам нужно сделать, чтобы начать использовать jcabi-xml для XSL-преобразований, это добавить эту зависимость в ваш pom.xml :

1
2
3
4
<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-xml</artifactId>
</dependency>

Если у вас есть какие-либо проблемы или предложения, не стесняйтесь отправлять сообщения в систему отслеживания проблем Github.

Ссылка: XSL-трансформация в Java: легкий путь от нашего партнера по JCG Егора Бугаенко из блога About Programming .