пятница, 20 апреля 2018 г.

XML. Конспект 4

Средства преобразований XML
В браузере: <?xml-stylesheet type="text/xsl" href="style.xsl"?>



Программные средства: утилита Майкрософт msxsl.
Кладем файлы xml, xsl и  msxsl в корень сайта.
В командной строке консоли набираем: с:\> msxsl books.xml books.xsl –o result.txt
Это поместит наши файлы в файл result.txt

Плагины - XML-tools - XSL Transformation. Указываем ему наш xsl-файл и жмем на Transform.

Создание XSL-документа
XSL - XML-документ
Все элементы принадлежат пространству имён: http://www.w3.org/1999/XSL/Transform
В XSL-документе могут использоваться любые пространства имён

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</xsl:stylesheet>

stylesheet - корневой элемент жокумента.


XSL - продвинутый шаблонизатор.

Шаблоны и шаблонные правила.
Шаблон (шаблонное правило) – правило обработки части XML документа.

<xsl:template match="Xpath_выражение">
тело шаблона
</xsl:template>

Вывод значения. Например, выведем название книги.
<xsl:template match="Xpath_выражение">
<xsl:value-of select="Xpath_выражение">
</xsl:template>

ПРИМЕР.
Файл demo-1.xml
<?xml version="1.0" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="demo-1.xsl"?>
<pricelist>
<book id="1" store="yes">
<title>XML и IE5</title>
<author>Алекс Гомер</author>
<price>200</price>
</book>

<!-- Комментарий -->

<book id="2">
<!-- Супер книжка -->
<title>Dimanic HTML</title>
<author>Алекс Хоумер</author>
<price>120</price>
</book>

<book id="3">
<title>Технология XSLT</title>
<author>Алексей Валиков</author>
<price>150</price>
</book>

<book id="4" store="yes">
<title>XSLT</title>
<author>Стивен Холзнер</author>
<price>170</price>
</book>

<book  id="5" store="yes">
<!-- Супер книжка -->
<title>Практическая криптография</title>
<author>Михаил Масленников</author>
<price>200</price>
</book>

<book id="6">
<title>Реест Windows XP</title>
<author>Джерри Хонейкатт</author>
<price>250</price>
</book>

<book id="6">
<title>Windows XP. Средства повышения производительности</title>
<author>Уолтер Брюс</author>
<price>250</price>
</book>

<book id="7">
<title>Windows Script Host для Windows 2000/XP</title>
<author>Андрей Попов</author>
<price>220</price>
</book>

<book  id="9">
<title>Excel 2002. Библия пользователя</title>
<author>Джон Уокенбах</author>
<price>260</price>
</book>

<book  id="10">
<title>XML. Справочник</title>
<author>Сандра Э. Эдди</author>
<price>100</price>
</book>

<book  id="11">
<title>Разработка защищенных Web-приложений на платформе Windows 2000</title>
<author>Майкл Ховард</author>
<price>250</price>
</book>

<book  id="12">
<title>WAP-программирование на языке WML</title>
<author>Михаэль Зеебергер-Вайхсельбаум</author>
<price>150</price>
</book>
<test>test</test>

test2
</pricelist>

Файл demo-1.xsl

match показывает к какому узлу применятся этот шаблон.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="book">
КНИГА
</xsl:template>

</xsl:stylesheet>

ПРИМЕР. Выведем заголовок книги. Файл demo-1.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="book">
<xsl:value-of select="title"/>
</xsl:template>

</xsl:stylesheet>

ВВЕДЕНИЕ В X-PATH

На заметку! Чем является язык SQL для баз данных, X-Path является для XML.
В плагинах XML Tools есть плагин Evaluate Xpath expression.
Открываем его и пишем команду для возврата всех заголовков в xml-документе: /pricelist/book/title

В плагине XPathernizerNPP есть раздел Show XPathernizer Window.
Пишем: /pricelist/book/title и жмем Execute.
Внимание корень обозначается, как /

XPath выражения похожи на пути к файлам
<xsl:template match="job/title">

/ - абсолютный путь
<xsl:template match="/emploee/job/title">

// - поиск элементов на любой глубине
<xsl:template match="/emploee//name">

* - любой элемент
<xsl:template match="*">

СХЕМЫ
Абсолютный путь: /шаг/шаг/...
Относительный путь:  шаг/шаг/..

Выберем все узлы у book: /pricelist/book/*

X-PATH ДЕРЕВО ДОКУМЕНТА И ТИПЫ УЗЛОВ
<catalog xmlns="urn:litwareinc">
<?proc instr?>
<!--comment-->
<product code="123">
Blue jeans
</product>
</catalog>

У catalog есть дети:
product
"proc-instr" - процессинговая инструкция
"comment" - комментарий
"urn:litware" - пространство имен

Дети product:
"urn:litwareinc"
"123"
"Blue jeans"

ОСИ ВЫБОРКИ (axes)
ПРИМЕР
<catalog>
<product code="123">
<price>35.99</price>
</product>
<product code="456">
<price>22.95</price>
<discount>
<amount>25</amount>
</discount>
</product>
<product code="789">
<price>185.00</price>
</product>
</catalog>

Оси:
self - возвращает сам элемент, допустим, product
child - возвращает детей элементов
parent - родитель, в нашем случае это каталог
attribute - атрибуты
descendant - все дети и дети детей. Двойной слеш // отвечает за descendant
descendant-or-self - все дети и дети детей + сам элемент
ancestor - все предки
ancestor-or-self - все предки + сам элемент
following - все элементы со своими детьми, которые находятся справа от данного элемента со своими потомками, т.е справа и вниз
following-sibling - все нижлежащие элементы одного уровня, т.е только соседи без своих детей
preceding - то что слева и вверх, т.е выбирает все узлы, которые появляются перед текущим узлом, за исключением предков, узлов атрибутов и пространства имен
preceding-sibling - Выбирает все элементы одного уровня до текущего узла

Использование осей в XPath
Многие выражения имеют сокращенную запись

Ось
child
attribute
self
parent
descendant-or-self

Полная запись
child::price
attribute::code
self::node()
parent::node()
/descendant-or-self()/price

Сокращенная запись
price
@code
.
..
//price

Например, мы пишем так: /pricelist/book/child::title
Сокращенная запись: /pricelist/book/title

Выбираем книгу по id: /pricelist/book/attribute::id
Сокращенная запись: /pricelist/book/@id

Некоторые оси не имеют сокращенной записи ancestor::node()

Выборки по осям
Выборка узла по имени - Child examples - Attribute examples
Имя узла - price - @code
Все узлы - * - @*
Имя и пространство - aprefix:price - @aprefix:code
Все узлы в пространстве - aprefix:* - @aprefix:*

Выборка узлов по типу: axis::node-type-function()
Функции для выборки:
text() - выборка текста
node() - возвращает узел элемента
processing-instruction() - возвращает процессинговую инструкцию
comment() - возвращает коментарий

ПРИМЕР. Файл demo-2.xml
<?xml version="1.0" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="demo-2.xsl" ?>

<demo message="Мега документ">
<test message="hello, world"
xmlns="http://igor-borisov.ru/namespace1">123</test>

<!-- Этот пример показывает использование пространств имен -->

<test message="Привет МИР"
xmlns="http://igor-borisov.ru/namespace2">987</test>
</demo>

Файл demo-2.xsl
Заметка! Импортируем пространства имен!
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://igor-borisov.ru/namespace1"
xmlns:ns2="http://igor-borisov.ru/namespace2">


<xsl:template match="/">
<xsl:value-of select="/demo/ns2:test/@message" />
<br />
<xsl:value-of select="/demo/comment()" />
<br />
<xsl:value-of select="/processing-instruction()" />
</xsl:template>

</xsl:stylesheet>

Возвращает при запуске xml-файл следущее: Привет МИР Этот пример показывает использование пространств имен type="text/xsl" href="demo-2.xsl"

Предикаты.
Выражение может иметь предикаты
axis::node-test[predicate]…
Фильтрация
Положение узла: product[last()]
Содержание узла: product[@code="123"]
Присутствие узла, т.е есть ли узел или нет: product[@code]
Можно использовать несколько предикатов. Они читаются слева направо.
product[3][@discount]

Пример предиката. Получим третью книгу: /pricelist/book[3]
Получим последнюю книжку с помощью функции last(): /pricelist/book[last()]
Получим книгу с ценой больше 150: /pricelist/book[.>150]

Получим название книги с ценой больше 150: /pricelist/book[.>150]/../title
Мы можем написать и так: /pricelist/book[./price>150]/title
Или так сокращенно: /pricelist/book[price>150]/title - сейчас мы в контексте book, не price

Выберем книгу с id = 2: /pricelist/book[@id=2]
Выберем все книги, у которых есть атрибут store: /pricelist/book[@store]

Выберем все книги, у которых есть атрибут store и верни вторую книгу:  /pricelist/book[@store][2]

Операции в XPath
Логические операции: A and B, A or B
Арифметические операции
 A + B, A - B, A * B, A div B,
A mod B, - A
Операции сравнения: A = B, A != B, A > B, A < B,
A >= B, A <= B


Выберем все книги, у которых id > 3 и меньше 8: /pricelist/book[@id>3 and @id<8]

Булевские функцииboolean(object) 
not(boolean)
true()
false()

Числовые функции
number(object)
sum(node-set)
floor(number) - округление к низу
ceiling(number) - округление к верху
round(number) - стандартное округление

Пример: sum(/pricelist/book/price)

Строковые функции
string(object)
concat(string, string, string*) - склеивание строки. Пример: concat('I', '', 'love', '', 'XML')
starts-with(string, string) - Пример (вернуть все title, которые начинаются с XML): /pricelist/book/title[starts-with(., 'XML')]
contains(string, string) - содержится. Пример: /pricelist/book/title[contains(., 'XML')]
substring-before(string, string) - возвращает подстроку до того
substring-after(string, string) - возвращает подстроку после того
substring(string, number, number?) - строка, позиция, ограничитель длины
string-length(string?) - длина строки
normalize-space(string?) -  обрезаем пробелы
translate(string, string, string) - (строка с которой мы осуществляем преобразования; символы в строке, которые мы будуем менять; то, на что мы их меняем)
('abcccbba', 'abc', 'ABC')
Переводит что-то во что-то.

Функции множества узлов
last() - возвращает позицию последнего узла
position() - возвращает текущую позицию. Пример, вернем все четные книжки: /pricelist/book[position() mod 2 = 0]
count(node-set) - считает кол-во. Пример, подсчитаем общее кол-во книг: count(/pricelist/book)
local-name(node-set?)
namespace-uri(node-set?)
name(node-set?)

Уточнение: x:title - это name
title - local-name, имя без пространства имен
x - namespace-uri, пространство имен

Выбери всех детей, у которых имя равно title: /pricelist/book/*[name() = 'title']
У нас возвращаются все названия книг.

Пример. 
Файл lab-4-2.xml
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="lab-4-2.xsl"?>

<pricelist>
<book id="1" store="yes">
<title>XML and IE5</title>
<author>Pupkin</author>
<price>200</price>
</book>
</pricelist>


Файл lab-4-2.xsl
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="book[1]">
<xsl:value-of select="title"/>
</xsl:template>

</xsl:stylesheet>

Выводит: XML and IE5


Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html