51

Re: XML

Практическая работа с XSLT

Переменные и параметры
<xsl:variable
name="name"
select="expression">
<!-- Content:template -->
</xsl:variable>

Использование переменных:
<xsl:variable name="header">
<tr>
<th>Element</th>
<th>Description</th>
</tr>
</xsl:variable>
<table>
<xsl:copy-of select="$header" />
<xsl:for-each select="root/item">
</table>

Параметры и шаблоны:
<xsl:param
name="paramName"
select="expression">
<!-- Content:template -->
</xsl:param>
<xsl:call-template name="show_title">
<xsl:with-param name="paramName" />
</xsl:call-template>

 Выборка уникальных значений
Группировка – выборка уникальных
элементов из набора
 Задача группировки найти множество
элементов с одинаковым значением и
взять первый элемент множества
 Первый элемент - это элемент не имеющий
предыдущего:
 preceding-sibling::item[…условие…] == null

 Группировка Мюнха
Ключи! С помощью ключей можно выбрать множество узлов по их свойствам
<xsl:key name="ixAuthor"
match="/pricelist/book/author" use="." />
<xsl:variable name="authors"
select="/pricelist/book/
author[generate-id(.) =
generate-id(key('ixAuthor', .))]" />

 Функция generate-id(множество) возвращает ID первого элемента множества

 Выборка узлов с множественной группировкой
 XSL Formatting Objects (обзорно)
<?xml version="1.0" encoding="ISO-8859-1"?>
<fo:root xmlns:fo="http://_.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<!-- Page template goes here -->
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<!-- Page content goes here -->
</fo:page-sequence>
</fo:root>

Лабораторная работа 7
Выборка узлов с множественной группировкой
Упражнение 1: Создание XML-документа
• Откройте редактор Notepad++
• Создайте новый файл и сохраните его под именем lab-7.xml
• Установите кодировку документа UTF-8
• Наберите следующий текст:
<?xml version="1.0" encoding="utf-8" ?>
<lab7>
<item city="Москва" org="ООО Рога и Копыта" title="Кепка" value="120" />
<item city="Москва" org="ООО Рога и Копыта" title="Велосипед" value="5" />
<item city="Москва" org="ООО Рога и Копыта" title="Футблока" value="10" />
<item city="Москва" org="ООО Светлана" title="Кепка" value="120" />
<item city="Москва" org="ООО Светлана" title="Футблока" value="10" />
<item city="Москва" org="ООО Ариадна" title="Велосипед" value="120" />
<item city="Москва" org="ООО Ариадна" title="Футблока" value="10" />
<item city="Петербург" org="ООО Стрелка" title="Кепка" value="120" />
<item city="Петербург" org="ООО Стрелка" title="Велосипед" value="5" />
<item city="Петербург" org="ООО Стрелка" title="Футблока" value="10" />
<item city="Петербург" org="ООО Светлана" title="Кепка" value="120" />
<item city="Петербург" org="ООО Светлана" title="Футблока" value="10" />
<item city="Петербург" org="ООО Петр I" title="Велосипед" value="120" />
<item city="Петербург" org="ООО Петр I" title="Футблока" value="10" />
</lab7>
• Сохраните файл
• Проверьте XML на правильность
Упражнение 2: XSLT преобразование в HTML для вывода списка товаров
• Создайте новый файл и сохраните его под именем lab-7.xsl
• Установите кодировку документа UTF-8
• Создайте корневой шаблон преобразования
• Создайте ключ для выбора городов
• Создайте составной ключ для выбора компании в городе
• Выберите и сохраните в переменную (#1) все города (уникальные значения)
• Проходя циклом по набору уникальных городов выберите и сохраните в переменную (#2) все
уникальные компании (организации в этом городе)
Проходя циклом по компаниям в указанном городе (переменная #1) выберите все товары с
сортировкой по названию и выведите их в браузер
• Посчитайте промежуточные итоги: общее количество товаров для каждой компании и общее
количество товара для каждого города
• Сохраните и проверьте свою работу

Выводы:
Переменные XSLT очень удобны для выборки данных
 Переменные не могут изменять свое значение
 Параметры используются в именованных шаблонах
 Группировка Мюнха – быстрый способ сформировать группированные данные
 XSL FO – способ формирования печатных листов

Поделиться

52

Re: XML

Интеграция XML данных:
 Использование XML
 XLink, XPointer, XQuery
w3.org/Consortium/siteindex.html
 RSS
web.resource.org/rss/1.0/spec
 FB2
gribuser.ru/xml/fictionbook/index.html
 WSDL, SOAP, XML-RPC
w3.org/2002/ws/
 MathML
w3.org/Math/
 SVG
w3.org/Graphics/SVG/

 Манипуляция XML данными в Microsoft Office 2010
 Интеграция данных с Microsoft Office Excel 2010
 Интеграция с Microsoft Office Access 2010
 Интеграция с Microsoft Office Word 2010
 Использование Microsoft Office InfoPath 2010
Быстро создаются (практически без программирования)
 Могут повторно использоваться (формат данных – XML)
 Легко собираются в едином месте хранения (библиотеки форм InfoPath)
 Для работы может не требоваться само приложение InfoPath (!) – Forms Server
 Легко интегрируются в существующие бизнес-процессы

Поделиться

53

Re: XML

Лабораторная работа 8
Создание простого приложения Microsoft Office InfoPath 2010
Упражнение 1: Создание нового документа InfoPath на основе существующего
XML-документа
• Выберите в меню Windows
[ Start (Пуск) -> All Programs (Все программы) -> Microsoft Office → Microsoft InfoPath
Designer 2010 ]
• Выберите пункт меню «Coздать» и в группе «Дополнительные шаблоны форм»
щелкните два раза левой кнопкой мыши по пункту «XML или схема»
• В диалоговом окне «Мастер источника данных» нажмите кнопку «Обзор...» и
выберите в качестве примера файл lab-7.xml из предыдущей лабораторной работы
• Нажмите кнопку «Далее >»
• Выберите «Нет» и нажмите кнопку «Готово»
• В диалоговом окне нажмите кнопку «Нет»
Упражнение 2: Создание формы InfoPath
• На правой панели «Поля» разверните элемент item в структуре данных (нажав на
иконку [+])
• Щелкните правой кнопкой мыши по элементу value и выберите пункт контекстного
меню «Свойства»
• Выберите из списка «Тип данных» значение «целое число (integer)»
• Нажмите кнопку «OK»
• Выберите пункт главного меню
[ Макет страницы -> Шаблоны макетов страниц -> Только заголовок ]
• Щелкните по фразе «Щелкните, чтобы добавить название» и введите «Наши
товары»
• На правой панели «Поля» щелкните мышкой по элементу item и перетащите его на
область «Добавить таблицы»
• Выберите «Повторяющаяся таблица»
• Удалите элемент Item из таблицы, выделив столбец и щелкнув правой кнопкой
мышки по пункту «Удалить столбцы»

Поделиться

54

Re: XML

Выводы:
XML используется повсеместно
 Microsoft Office 2010 очень тесно связан с
XML
 XML можно легко подключить к различным офисным приложениям
 Microsoft Office InfoPath 2010 – XML приложение для сбора и обработки бизнес-информации
 Формы InfoPath быстро создаются практически без программрования

Поделиться

55

Re: XML

<!DOCTYPE> Синтаксис:
<!DOCTYPE [Элемент верхнего уровня] [Публичность] "[Регистрация]//[Организация]//[Тип] [Имя]//[Язык]" "[ URL]">
htmlbook.ru/html/!doctype

Поделиться

56

Re: XML

xpath для select:
Вот некоторые примеры выражений пути, которые используют сокращенный синтаксис

w3.org/ TR/xpath20/#id-context-item-expression


para selects the para element children of the context node


* selects all element children of the context node


text() selects all text node children of the context node


@name selects the name attribute of the context node


@* selects all the attributes of the context node


para[1] selects the first para child of the context node


para[fn:last()] selects the last para child of the context node


*/para selects all para grandchildren of the context node


/book/chapter[5]/section[2] selects the second section of the fifth chapter of the book whose parent is the document node that contains the context node


chapter//para selects the para element descendants of the chapter element children of the context node


//para selects all the para descendants of the root document node and thus selects all para elements in the same document as the context node


//@version selects all the version attribute nodes that are in the same document as the context node


//list/member selects all the member elements in the same document as the context node that have a list parent


.//para selects the para element descendants of the context node


.. selects the parent of the context node


../@lang selects the lang attribute of the parent of the context node


para[@type="warning"] selects all para children of the context node that have a type attribute with value warning


para[@type="warning"][5] selects the fifth para child of the context node that has a type attribute with value warning


para[5][@type="warning"] selects the fifth para child of the context node if that child has a type attribute with value warning


chapter[title="Introduction"] selects the chapter children of the context node that have one or more title children whose typed value is equal to the string Introduction


chapter[title] selects the chapter children of the context node that have one or more title children


employee[@secretary and @assistant] selects all the employee children of the context node that have both a secretary attribute and an assistant attribute


book/(chapter|appendix)/section selects every section element that has a parent that is either a chapter or an appendix element, that in turn is a child of a book element that is a child of the context node.

Поделиться

57

Re: XML

Вариант XSL парсинга лотусового XML


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://_.w3.org/1999/XSL/Transform"
      exclude-result-prefixes="ldn"
      version="1.0"
      xmlns:ldn="http://_.lotus.com/dxl">
      <xsl:namespace-alias stylesheet-prefix="xsl" result-prefix="xsl"/>
    <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>

    <xsl:template match="ldn:document">
        <!-- создание рутового элемента  -->
        <konteyner>
        <xsl:apply-templates select="ldn:item"/>
        </konteyner>
    </xsl:template>


    <xsl:template match="ldn:item">
   
        <xsl:if test="@name='ЗАГОЛОВОК'">
        <Header>
            <!--<xsl:element name="{@name}"><xsl:value-of select="." /></xsl:element>-->
            <xsl:apply-templates select="ldn:text" />
        </Header>
        </xsl:if>
       
        <xsl:if test="@name='РЕГИСТРАЦИОННЫЙ_НОМЕР'">
                 <RegNumber>
                 <xsl:apply-templates select="ldn:text"/>
   </RegNumber>     
        </xsl:if>
       
            <xsl:if test="@name='ДАТА_РЕГИСТРАЦИИ'">
            <DataReg>
                 <xsl:apply-templates select="ldn:datetime"/>
                 </DataReg>
        </xsl:if>
       
        <xsl:if test="@name='ПРИЛОЖЕНИЯ_'">
            <Applicat>
               <xsl:value-of select="ldn:notesbitmap" />
            </Applicat>

<Word>
<xsl:value-of select="ldn:attachmentref" />
</Word>

</xsl:if>


     <xsl:if test="@name='$FILE'">
      <Filedatetimecreated><xsl:apply-templates select="ldn:object/ldn:file/ldn:created/ldn:datetime"/></Filedatetimecreated>
            <FileNode><xsl:apply-templates select="ldn:object/ldn:file/ldn:filedata"/></FileNode>
        </xsl:if>

       
    </xsl:template>


</xsl:stylesheet>

Поделиться

58

Re: XML

Есть в XML:

<item name="СОДЕРЖАНИЕ" sign="true" seal="true">
<richtext>
<par>
<attachmentref name="4-06.05.2014-0127118666.xml" displayname="4-06.05.2014-0127118666.xml" caption=" - 4-06.05.2014-0127118666.xml">

Хочу с помощью XSL:

<xsl:if test="@name='СОДЕРЖАНИЕ'">
<attachmentrefname>
<xsl:value-of select="ldn:richtext/ldn:par/ldn:attachmentreft/@name" />
</attachmentrefname>
</xsl:if>
Получить значение в узле name.

На выходе только:
<attachmentrefname/>

Поделиться