Веб Дизайн - статьи

         

Двухступенчатое преобразование XML-документа


В предыдущей главе рассказывалось об одном из способов организации состава клиентской части XML/EDI. Основным недостатком построения клиентской части по схеме одноступенчатого преобразования является "мануальностью" системы, т.е. система является не автоматической: Пользователь из Компании 1 (см. рис 5) должен взять из информационной системы своей компании информацию и в ручную заполнить форму Браузера, которая формирует XML документ (На рис. 5 для наглядности изображено два разных компьютера, один из которых является частью Intranet компании, и другой, который посредством WEB browser формирует XML документ).

Рис. 5

Компания 2, где расположена серверная часть, осуществляет автоматическую обработку XML-документа, без непосредственного участия человека. Было бы целесообразно, организовать обмен электронными документами таким же образом и на отправляемой стороне, т.е. чтоб человек мог только контролировать передачу документов, не осуществляя каких-либо ручных операций по заполнению HTML-форм.

Так на рис. 5, изображена топология внутреннего взаимодействия в Компании 3, где оператор со своего рабочего места вносит необходимые данные в информационную систему своей компании, которая автоматически, при определенных условиях, формирует XML-документ и отправляет его адресату.

Такая организация передачи электронных документов возможна разными способами: использование встроенных в HTML файл объектов ActiveX или написание специальных Java программ, которые реализовывали бы серверные обмены.

Другой из возможных вариантов построения системы XML/EDI - является использование двухступенчатого формирования электронного документа. На рис. 6 представлена схема двухступенчатого преобразования XML документа в EDI-сообщение.

Рис.6

На первом этапе, осуществляется преобразование XML-источника, используя XSL-преобразование стандартным XSL-анализатором, в формат метаданных XEDI.. По своей сути, формат метаданных XEDI - является своего рода новым языком, описанного языком разметки.




Второй этап заключается в прямом преобразовании метаданных XEDI транслятором XML/EDI непосредственно в EDI-сообщение. Аналогичный процесс, но уже в обратном порядке, происходит при конвертации EDI-сообщения в XML-документ.



Преимущество идеи двухступенчатого преобразования в том, что метаданные XEDI описывают любые виды EDI-сообщений в соответствии с XEDI синтаксисом. Одноступенчатое преобразование применяется в основном в системах, использующих один тип сообщения.

Ниже будут изложены предложения XML-EDI Group, заложенные в преобразование метаданных.

Сообщение UN/EDIFACT можно разобрать на следующие самостоятельные единицы, вложенные друг в друга:


  • Сообщение
  • Группа сегментов
  • Сегмент
  • Группа Элементов данных
  • Элемент данных или Квалификатор


Каждой самостоятельной единице будет соответствовать свой элемент XML (элемент метаданных XEDI). Можно выделить следующее соответствие EDI-XML:

Сообщение<Message Name=имя сообщения>
Группа сегментов<SegmentGroup>
Сегмент<Segment Name=имя сегмента>
Группа Элементов данных<ElementGroup >
Элемент данных
Квалификатор
<DataElement id=код данных>
Каждый элемент XML имеет определенный набор параметров, которые содержат информацию. Возвращаясь к нашему примеру, Все содержание EDI-сообщения INVOICE будет обрамлено следующими тагами:

<Message Name="INVOICE">

..... сегменты и группы сегментов, составляющие сообщение ...

</Message>

Значение атрибута Name для тага <Message> представляет имя EDI-сообщения. Для упрощения синтаксического анализа и сохранения наглядности документа вводится таг <SegmentGroup>, который обрамляет повторяющиеся группы сегментов:

<Message Name="INVOICE"> <Segment Name="UNH"> <!-- содержание сегмента UNH --> </Segment>

<Segment Name="BGM"> <!-- содержание сегмента BGM --> </Segment> <!-- ....... информация о сегментах DTM,NAD-->

<SegmentGroup> <!-- ......


обрамляет группу сегментов (LIN, IMD,MEA,QTY,PRI,CUX) --> <Segment Name="LIN"> <!-- ...... содержание сегмента LIN --> </Segment> <Segment Name="IMD"> <!--...... содержание сегмента IMD --> </Segment> <!--..... информация об остальных сегментах группы LIN (MEA,QTY,PRI,CUX) --> </SegmentGroup> <!--.... контрольная секция, сегменты UNS,CNT,UNT --> </Message>

Каждый сегмент содержит группу элементов данных, в соответствии со справочником сегментов EDSD, который входит в набор стандартов UN/EDIFACT. Например, в соответствии со справочником EDSD, сегмент NAD (имя и адрес) имеет следующие описание:

№ группыКод справочникаОписание данныхУсл/обязформат
0103035КВАЛИФИКАТОР УЧАСТНИКАMan..3
020C082ОСОБЕННОСТИ ИДЕНТИФИКАЦИИ УЧАСТНИКОВC  
 3039Идентификация участниковMan..35
 1131Квалификатор контролирующего органаCan..3
 3055Код контролирующего органаCan..3
030C058НАЗВАНИЕ И АДРЕСС 
 3124Строка имени (названия) и адресаMan..35
 3124Строка имени (названия) и адресаCan..35
040C080НАЗВАНИЕ УЧАСТНИКАС 
 3036Название участникаMan..35
 3036Название участникаCan..35
 3045Код названия участникаCan..3
050С059УЛИЦА C 
 3042Улица и номер п.я.Can..35
 3042Улица и номер п.я.Can..35
0603164НАЗВАНИЕ ГОРОДА Can..35
0703229ИДЕНТИФИКАЦИЯ РЕГИОНАCan..9
0803251ИДЕНТИФИКАЦИЯ ПОЧТОВОГО КОДАCan..9
0903207КОД СТРАНЫCan..3
Возвращаясь к нашему примеру, кодировка в UN/EDIFACT NAD+SE+++OY Valio++ Helsinki++Box 789+Fi' будет преобразована в:

<Segment Name="NAD"> <DataElement id=10 dic=3035> SE </DataElement>

<DataElement id=40> OY Valio </DataElement>

<DataElement id=60> Y=Helsinki </DataElement>

<DataElement id=80> Box 789 </DataElement>

<DataElement id=90 dic=3207> FI </DataElement>



</Segment>

Атрибутом тага <DataElement> id - является номер группы в справочнике элементов данных, а атрибут dic - номер справочника, по которому определяется квалификатор.

Элементы данных могут быть простыми и составными, состоящими из компонентов. Составные элементы данных объединяются тагами <ElementGroup>. Например, сегмент цена: PRI+INV:180' содержит составной элемент данных, включающий квалификатор INV (цена по инвойсу) и значение цены - 180:

<Segment Name="PRI"> <ElementGroup id=10> <DataElement id=1 dic=5125> INV </DataElement>

<DataElement id=2 dic=5118> 180 </DataElement>

</ElementGroup>

</Segment>

В данном примере таг <ElementGroup> имеет аттрибут id, который имеет значение положения составного элемента по справочнику EDCD. Значения id тага <DataElement> представляет относительное месторасположение в справочнике сегментов.

Преобразование XML документа в метаданные осуществляется посредством обработки XQL-запросов анализатором XSL. Ниже представлен текст запроса для преобразования EDIFACT элемента PRI (таг <Price> ) в XEDI метаданные:

<xsl:template>

xsl:for-each select="//Price"> <Segment Name="PRI"> <ElementGroup id=10> <DataElement id=1 dic=5125> INV </DataElement>

<DataElement id=2 dic=5118> <xsl:value-of select="//Price"/> </DataElement>

</ElementGroup>

</Segment>

</xsl:for-each>

</xsl:template>

Таг <xsl:template> определяет область действия шаблона XSL фильтра, а таг <xsl:for-each> определяет область шаблона, на которую распространяется данный запрос. Параметр select определяет область действия запроса в соответствии с синтаксисом запроса. Таг <xsl:value-of select=строка запроса /> осуществляет подстановку результата.

Синтаксис строки запроса схож с обычным способом определения пути к ресурсу- список узлов дерева, разделенных символом /.


Для выделения всех дочерних элементов - используется символ "*", для выделения элемента, расположенного просто "ниже" по дереву(на любом уровне вложенности) символ - "//". Условие на значение в запросе должно заключаться в символы "[" и "]". Для выбора значения атрибута в условии указывается символ @.

Примеры простых шаблонов:

" Transaction/"возвращает дочерние элементы для элемента Transaction
"Consignor//"список всех элементов, вложенных в Consignor
"SegmentName[@Id]"список элементов SegmentName, в котором определен атрибут Id
"SegmentName [@Id=2]"поиск всех тагов, которые имеют значение атрибута id равное 2
При формировании ответа на сообщение обратное преобразование из метаданных в XML-документ, осуществляется с помощью следующего шаблона:

<xsl:template>

xsl:for-each select="//Segment/"> <Price> <xsl:value-of select=" Segment[@Name="PRI"]/DataElement[@Id="2"]"/> </Price> </xsl:for-each>

</xsl:template>

Данный запрос интерпретируется как: выбрать все значения из тагов <DataElement&gt;, имеющие значение параметра Id="2", и которые имеют вхождение в таги <Segment> со значением параметра Name="PRI".

Выполнение более сложных запросов, например, при формировании метаданных для сегмента NAD осуществляется, учитывая уровни вложенности:

<xsl:template>

xsl:for-each select="//Consignor"> <Segment Name="NAD"> <DataElement id=10 dic=3035> SE </DataElement>

<DataElement id=40> <xsl:value-of select="//Consignor/ConsignorName"/> </DataElement>

<DataElement id=50> <xsl:value-of select="//Consignor/Address/Street"/> </DataElement>

<DataElement id=60> <xsl:value-of select="//Consignor/Address/City"/> </DataElement>

<DataElement id=80> <xsl:value-of select="//Consignor/Address/Zip"/> </DataElement>



<DataElement id=90 dic=3207> <xsl:value-of select="//Consignor/Address/Country"/> </DataElement>

</Segment>

</xsl:for-each>

</xsl:template>

В заключение хочется отметить, что предлагаемый способ формирования XEDI метаданных находится на стадии утверждения. В настоящее время в XML-EDI Group находится на рассмотрении предложения по комбинированному формированию метаданных, при котором используется конверсия не только стандарта UN/EDIFACT, но и не менее популярного в США и Германии стандарта формирования электронных документов ANSI X12.

Автор будет очень благодарен за отзывы об актуальности темы, общем содержании, виде и стиле изложения, а также всем остальным комментариям, которые помогут в дальнейшем улучшить качество написания сборника статей и выпуску книги освещающую тему использования электронных документов. Также автору будет интересно узнать пожелания читателей об освещении смежных тем, связанных с использованием электронных документов и электронной коммерции. Свои комментарии и пожелания просьба направлять на Автор постарается ответить на вопросы, связанной с изложенным материалом или осветить их в будущем.



Содержание раздела