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