Введение в XSLT
Эта статья представляет собой введение в таблицы стилей преобразования XML, более известное как XSLT [ref] , с некоторыми простыми примерами.
На самом деле, я хотел назвать эту статью «Java и XML — часть 4 (XSLT)», но, поскольку я упомянул Java-часть в одной из моих предыдущих статей [ref], здесь , похоже, нет необходимости. В этой статье вы можете увидеть, как выглядит синтаксис для привязки процесса XSLT с использованием анализаторов JAXP DOM и JDOM2.
Файлы XSL имеют синтаксис XML, но они используются для преобразования одного файла XML в другой. Преобразование XML также можно выполнить с помощью анализаторов JAXP, но для этого требуется гораздо больше кода.
Если вашей любимой IDE является Eclipse, то вы можете использовать перспективу XML для тестирования XSL-файлов. Дальнейшее объяснение можно найти в блоге Ларса Фогеля [ref] . При таком подходе вы можете сосредоточиться на разработке логики преобразования, используемой XSLT, не затрагивая другие части вашего приложения.
Примеры
Я нашел хорошую статью под названием «10 XSLT или XML, XSL-преобразование: вопросы для интервью и ответы для Java-программистов» [ref], которую я буду использовать здесь как примеры использования. Подобные примеры, подобные следующим, можно прочитать на сайте «xmlplease» [ref] .
Дан простой XML-файл:
<?xml version="1.0" encoding="UTF-8"?> <person type="employee"> <firstName>John</firstName> <lastName>Doe</lastName> </person>
Пустой файл
Использование простого шаблона игнорирует все узлы и атрибуты.
Вот файл XSL:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- situation 1 --> <!-- output XML empty --> <xsl:template match="/" /> </xsl:stylesheet>
Вывод выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
Использование шаблона идентичности
С этим типом шаблона все узлы и атрибуты копируются в выходной XML-файл.
<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template>
Удаление элемента и атрибута
Вот файл XSL:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- situation 2 --> <!-- ignoring nodes and atrributes --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="firstName" /> <xsl:template match="@type" /> </xsl:stylesheet>
Вывод выглядит так:
<?xml version="1.0" encoding="UTF-8"?> <person> <lastName>Doe</lastName> </person>
Переименование элемента и атрибута
Вот файл XSL:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- situation 3 --> <!-- renaming nodes and atrributes --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="@type"> <xsl:attribute name="kind"> <xsl:value-of select="." /> </xsl:attribute> </xsl:template> <xsl:template match="person"> <item> <xsl:apply-templates select="@*|node()" /> </item> </xsl:template> </xsl:stylesheet>
Вывод выглядит так:
<?xml version="1.0" encoding="UTF-8"?> <item kind="employee"> <firstName>John</firstName> <lastName>Doe</lastName> </item>
Получение значения атрибута
Вот файл XSL:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- situation 4 --> <!-- retrieving atrribute value --> <xsl:template match="/person"> <personType> <xsl:value-of select="@type"></xsl:value-of> </personType> </xsl:template> </xsl:stylesheet>
Вывод выглядит так:
<?xml version="1.0" encoding="UTF-8"?> <personType>employee</personType>
связи
Другие ссылки на эту тему можно найти здесь, на DZone или в Интернете.
Ссылки на статьи DZone
http://architects.dzone.com/articles/some-basics-xslt http://architects.dzone.com/articles/obtaining-complete-xml-message http://architects.dzone.com/articles/how-handle-heavily-nested-xml http://java.dzone.com/articles/joox-and-xslt-xml-love-story
Ссылки на карточки DZone
http://refcardz.dzone.com/category/tags/xslt?page=1
Ссылки на фрагменты DZone
http://www.dzone.com/snippets/forloop-simple-loop-xslt http://www.dzone.com/snippets/find-and-replace-inside-xml http://www.dzone.com/snippets/trim-template-xslt http://www.dzone.com/snippets/xslt-recursively-set-prefix http://www.dzone.com/snippets/some-javascript-usefull http://www.dzone.com/snippets/formatting-time-xslt
Ссылки на новости DZone
http://java.dzone.com/news/death-xslt-web-frameworks
Ссылки на внешние уроки
http://zvon.org/xxl/XSLTutorial/Output/elementIndex.html http://zvon.org/comp/m/xslt.html http://www.w3schools.com/xsl/default.asp http://www.xmlplease.com
Ссылки на внешние лучшие практики
http://www.codedairy.com/blog/best-practices-and-coding-standards-for-using-xslt-transformations
GitHub
Источники для этого примера можно проверить по адресу : https://github.com/kstojanovski/java-and-xml . Используйте папку java-and-xml и запустите метод test файла TestJavaXml.java из папки test.