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 DynamoDBfinal 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: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 . |