Статьи

Введение в XSLT

Введение в 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.