А что это вообще такое?

         

Create. Создание документа на основе заданного XML



^xdoc::create{XML-код}
^xdoc::create[базовый_путь]{XML-код}

Конструктор создает объект класса xdoc из XML-кода. Возможно задание базовогопути.









Create. Создание нового пустого документа



^xdoc::create[имя_тега]
^xdoc::create[базовый_путь;имя_тега]



Конструктор создает объект класса xdoc, состоящий из единственного тега имя_тега. Возможно задание Базовогопути.









DOM



DOM1-интерфейс Document:

$DocumentType[$документ.doctype]
$Element[$документ.documentElement]


В Parser DOM-интерфейсы Node и Element и их производные реализованы в классе xnode.

Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html









DOM



DOM1-интерфейс Document:

$Element[^документ.createElement[tagName]]
$DocumentFragment[^документ.createDocumentFragment[]]
$Text[^документ.createTextNode[data]]
$Comment[^документ.createComment[data]]
$CDATASection[^документ.createCDATASection[data]]
$ProcessingInstruction[^документ.createProcessingInstruction[target;data]]
$Attr[^документ.createAttribute[name]]
$EntityReference[^документ.createEntityReference[name]]
$NodeList[^документ.getElementsByTagName[tagname]]

DOM2-интерфейс Document:

$Node[^документ.importNode[importedNode](deep)]
$Element[^документ.createElementNS[namespaceURI;qualifiedName]]  [3.1.1]
$Attr[^документ.createAttributeNS[namespaceURI;qualifiedName]]  [3.1.1]
$NodeList[^документ.getElementsByTagNameNS[namespaceURI;localName]]
$Element[^документ.getElementById[elementId]]


В Parser
·DOM-интерфейсы Node и Element и их производные реализованы в классе xnode;  
·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  
·DOM-тип DOMString - класс string;  
·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  

Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html

Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html









DOM



DOM1-интерфейс Node:

$узел.nodeName
$узел.nodeValue
$узел.nodeValue[новое значение]   [3.1.2]
^if($узел.nodeType == $xnode:ELEMENT_NODE){…}
$Node[$узел.parentNode]
$NodeList[$узел.childNodes]
$Node[$узел.firstChild]
$Node[$узел.lastChild]
$Node[$узел.previousSibling]
$Node[$узел.nextSibling]
$NodeList[$узел_типа_ELEMENT.attributes]
$Document[$node.ownerDocument]

DOM1-интерфейс Element:

$узел_типа_ELEMENT.tagName

DOM1-интерфейс Attr:

$узел_типа_ATTRIBUTE.name
^if($узел_типа_ATTRIBUTE.specified){…}
$узел_типа_ATTRIBUTE.value

DOM1-интерфейс ProcessingInstruction:

$узел_типа_PROCESSING_INSTRUCTION.target
$узел_типа_PROCESSING_INSTRUCTION.data

DOM1-интерфейс DocumentType:

$узел_типа_DOCUMENT_TYPE.name
$узел_типа_DOCUMENT_TYPE.entities
$узел_типа_DOCUMENT_TYPE.notations

DOM1-интерфейс Notation:

$узел_типа_NOTATION.publicId
$узел_типа_NOTATION.systemId


В Parser
·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  
·DOM-тип DOMString - класс string;  
·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  

Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html

Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html









DOM1.



DOM1-интерфейс Node:

$Node[^узел.insertBefore[$newChild;$refChild]]
$Node[^узел.replaceChild[$newChild;$oldChild]]
$Node[^узел.removeChild[$oldChild]]
$Node[^узел.appendChild[$newChild]]
^if(^узел.hasChildNodes[]){…}
$Node[^узел.cloneNode(deep)]

DOM1-интерфейс Element:

^узел.getAttribute[name]
^узел.setAttribute[name;value]
^узел.removeAttribute[name]
$Attr[^узел.getAttributeNode[name]]
$Attr[^узел.setAttributeNode[$newAttr]]
$Attr[^узел.removeAttributeNode[$oldAttr]]
$NodeList[^узел.getElementsByTagName[name]]
^узел.normalize[]

DOM2-интерфейс Element:

$строка[^узел.getAttributeNS[namespaceURI;localName]]   [3.1.1]
^узел.setAttributeNS[namespaceURI;localName;value]   [3.1.1]
^узел.removeAttributeNS[namespaceURI;localName]   [3.1.1]
$Attr[^узел.getAttributeNodeNS[namespaceURI;localName]]   [3.1.1]
$Attr[^узел.setAttributeNodeNS[$newAttr]]   [3.1.1]
$NodeList[^узел.getElementsByTagNameNS[namespaceURI;localName]]
^if(^узел.hasAttribute[name]){…}   [3.1.1]
^if(^узел.hasAttributeNS[namespaceURI;localName]){…}   [3.1.1]


В Parser
·DOM-интерфейс NodeList - класс hash с ключами 0, 1, …;  
·DOM-тип DOMString - класс string;  
·DOM-тип boolean - логическое значение: 0=ложь, 1=истина.  

Подробная спецификация DOM1 доступна здесь: http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html

Подробная спецификация DOM2 доступна здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html









File. Преобразование документа к объекту класса file



^документ.file[Параметры_преобразования_в_текст]

Преобразует документ к типу file. Возможно задание параметров_преобразования в текст.
По умолчанию создается XML-представление документа с заголовком <?xml… ?> (можно отключить вывод заголовка, задав соответствующий параметр).









Класс xdoc



Класс предназначен для работы с древовидными структурами данных в паре с xnode, и поддерживает считывание файлов в XML формате и запись в XML (http://www.w3.org/XML) и HTML, а также XSLT (http://www.w3.org/TR/xslt) трансформацию.

Работа с деревом производится в DOM-модели (http://www.w3.org/DOM), доступен DOM1 и ряд возможностей DOM2.

Класс реализует DOM-интерфейс Document и является наследником класса xnode.

Ошибки DOM-операций (интерфейс DOMException) преобразуются в исключения xml-типа.









Класс xnode



Класс предназначен для работы с древовидными структурами данных в паре с xdoc, поддерживает XPath (http://www.w3.org/TR/xpath) запросы.

Класс реализует DOM-интерфейсы Node и Element и их производные.
Класс напрямую не создается, используются соответствующие методы класса xdoc.

Вместо DOM-интерфейса NamedNodeMap в Parser используется класс hash.









Load. Загрузка XML с диска, HTTP-сервера или иного источника



^xdoc::load[имя файла]

Конструктор загружает XML-код из некоторого файла или адреса на HTTP-сервере и создает на его основе объект класса xdoc.
Parser может считать XML из произвольного источника, см. раздел «Чтение XML из произвольного источника».

имяфайла - имя файла с путем или URL файла на HTTP-сервере.









Параметр создания нового документа: Базовый путь



В конструкторах нового документа можно задать Базовыйпуть.

По действию он аналогичен заданию атрибута
<…
    xmlns:xml="http://www.w3.org/XML/1998/namespace"
    xml:base="базовый URI" …

Отличаясь тем, что пути задаются стандартным для Parser способом (см. «Приложение 1. Пути к файлам и каталогам»), что куда удобнее задания полного дискового пути, включающего путь к веб-пространству. По умолчанию равен пути к текущему обрабатываемому документу.
Внимание: символ «/» на конце пути обязателен.









Параметры преобразования документа в текст



В ряде методов можно задать хешПараметры_преобразования_в_текст.

Они идентичны атрибутам элемента <xsl:output … />.
Исключением являются атрибуты doctype-public и doctype-system, которые так задать нельзя.
Пока также является исключением cdata-section-elements.

По умолчанию текст создается в кодировке $request:charset, однако в XML заголовке или в элементе meta для HTML-метода Parser указывает кодировку $response:charset. Такое поведение можно изменить, явно указав кодировку в <xsl:output … /> или соответствующем параметре преобразования.   [3.1.2]

При создании объекта класса file можно задать параметр media-type, при задании нового тела ответа заголовок ответа content-type получит значение этого параметра.









Parser://метод/параметр. Чтение



Parser может считать XML из произвольного источника.
Везде, где можно считать XML, можно задать адрес документа вида…
parser://метод/параметр

Считывание документа по такому адресу приводит чтению результата работы метода Parser, ^метод[/параметр].









$document


$document[^xdoc::create[document]]
$paraNode[^document.createElement[para]]
$addedNode[^document.documentElement.appendChild[$paraNode]]
$response:body[^document.string[]]

$response:body


$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<document>
текст
</document>}]
$response:body[^document.string[]]

^xdoc::create


$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<document>
строка1<br/>
строка2<br/>
</document>}]
$response:body[^document.file[]]

^document.string


# выдаст документ в HTML-представлении без отступов
^document.string[
    $.method[html]
    $.indent[no]
]

^document.save


$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<document>
строка1<br/>
строка2<br/>
</document>}]
^document.save[saved.xml]

$xdoc


$xdoc[^xdoc::create{<?xml version="1.0"?>
<document xmlns:s="urn:special">
   <s:code>string</s:code>
</document>
}]
$xdoc.search-namespaces.s[urn:special]
^xdoc.selectString[string(//s:code)]

$.method


$document[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<document>
строка1<br/>
строка2<br/>
</document>}]
^document.string[
    $.method[html]
]

будет считан из каталога


$sheet[^xdoc::create[/xsl/]{<?xml version="1.0" encoding="$request:charset"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:import href="import.xsl"/>
</xsl:stylesheet>
}]

Здесь файл import.xsl, будет считан из каталога /xsl/.

Подробная спецификация XPath доступна здесь:


$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<document>
    <t/><t/>
</document>}]
# результат=список из двух элементов "t"
$list[^d.select[/document/t]]
# перебираем найденные листы:
#   этот код будет работать
#   даже если запрос не найдет ни одного листа 
^for[i](0;$list-1){
    $node[$list.$i]
    Имя: $node.nodeName<br>
    Тип: $node.nodeType<br>
}

В Parser DOM-интерфейс NodeList - класс hash с ключами 0, 1, …

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath

Подробная спецификация XPath доступна здесь:


$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<t attr="привет" n="123"/>}]
^if(^d.selectBool[/t/@n > 10]){
    /t/@n больше 10
}{
    не больше
}

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath

Подробная спецификация XPath доступна здесь:


$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<t attr="привет" n="123"/>}]
#результат=124
^d.selectNumber[number(/t/@n)+1]<br>
#результат=4
^d.selectNumber[2*2]<br>

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath

Подробная спецификация XPath доступна здесь:


$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<t attr="привет" n="123"/>}]
# результат=один элемент "t"
$element[^d.selectSingle[t]]
# результат=2 (количество атрибутов <t>)
Количество атрибутов: ^element.attributes._count[]<br>

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath

Подробная спецификация XPath доступна здесь:


$d[^xdoc::create{<?xml version="1.0" encoding="windows-1251" ?>
<t attr="привет" n="123"/>}]
# результат=привет
^d.selectString[string(t/@attr)]

Подробная спецификация XPath доступна здесь: http://www.w3.org/TR/xpath

Пример хранения XSL шаблонов в базе данных


@main[]

# к этому моменту в $xdoc находится документ, который хотим преобразовать
^xdoc.transform[parser://xsl_database/main.xsl]

@xsl_database[name]
^string:sql{select text from xsl where name='$name'}

Причем относительные ссылки будут обработаны точно также, как если бы файлы читались с диска.
Скажем, если parser://xsl_database/main.xsl ссылается на utils/common.xsl, будет загружен документ
parser://xsl_database/utils/common.xsl, для чего будет вызван метод ^xsl_database[/utils/common.xsl].









Пример (см. также «Урок 6. Работаем с XML»)


# входной xdoc документ
$sourceDoc[^xdoc::load[article.xml]]

# преобразование xdoc документа шаблоном article.xsl
$transformedDoc[^sourceDoc.transform[article.xsl]]

# выдача результата в HTML виде
^transformedDoc.string[
    $.method[html]
]

Если шаблон не считывается с диска, а создается динамически, важным вопросом становится «а откуда загрузятся <xsl:import href="some.xsl"/>?», обратите внимание на возможность задания базового пути: «Параметр создания нового документа: Базовый путь».









Пример загрузки XML-документа с диска


$document[^xdoc::load[article.xml]]
$response:body[^document.string[]]









Пример загрузки XML-документа с HTTP-сервера


$xdoc[^xdoc::load[http://www.cbr.ru/scripts/XML_daily.asp]]
На
    ^xdoc.selectString[string(/ValCurs/@Date)]
курс валюты
    $node[^xdoc.selectSingle[/ValCurs/Valute[CharCode='USD']]]
    "^node.selectString[string(Name)]"
равен
    ^node.selectString[string(Value)]
<hr>
<pre>^taint[^xdoc.string[]]</pre>









Save. Сохранение документа в файл



^документ.save[путь]
^документ.save[путь;Параметры_преобразования_в_текст]

Сохраняет документ в текстовый файл. Возможно задание параметров_преобразования в текст.
По умолчанию создается XML-представление документа с заголовком <?xml… ?> (можно отключить вывод заголовка, задав соответствующий параметр).

Путь - путь к файлу.









Search-namespaces. Хеш пространств имен для поиска[3.1.2]



$документ.search-namespaces

Для использования префиксов пространств имен в методах xnode.select* необходимо заранее эти префиксы определить в данном хеше.

Здесь
·ключи - префиксы пространств имен,  
·значения - их URI.  









Select. XPath поиск узлов



$NodeList[^узел.select[XPath-запрос]]

Выдает список узлов, найденных в контексте узла по заданному XPath-запросу. Если запрос не вернул подходящих узлов, выдается пустой список.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.









SelectBool. Вычисление логического XPath запроса



^узел.selectBool[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это логическое значение. Если не логическое значение, выдается ошибка типа parser.runtime.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.









SelectNumber. Вычисление числового XPath запроса



^узел.selectNumber[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это число. Если не число, выдается ошибка типа parser.runtime.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.









SelectSingle. XPath поиск одного узла



^узел.selectSingle[XPath-запрос]

Выдает узел, найденный в контексте узла по заданному XPath-запросу. Если запрос не нашел подходящего узла, выдается void. Если запрос выдал больше, чем один узел, выдается ошибка xml-типа.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.









SelectString. Вычисление строчного XPath запроса



^узел.selectString[XPath-запрос]

Выдает результат выполнения XPath-запроса в контексте узла, если это строка. Если не строка, выдается ошибка типа parser.runtime.

Для использования в запросе префиксов пространств имен необходимо их заранее определить, см. $xdoc.search-namespaces.









String. Преобразование документа в строку



^документ.string[]
^документ.string[Параметры_преобразования_в_текст]

Преобразует документ в текстовую форму. Возможно задание параметров_преобразования.
По умолчанию создается XML-представление документа с заголовком <?xml… ?> (можно отключить вывод заголовка, задав соответствующий параметр).









Transform. XSL преобразование



^документ.transform[шаблон]
^документ.transform[шаблон][XSLT-параметры]

Осуществляет XSL-преобразование документа по шаблону. Возможно задание XSLT-параметров.

Шаблон - или путь_к_файлу_с_шаблоном, или xdoc документ.
Parser может считать XML из произвольного источника, см. раздел «Чтение XML из произвольного источника».

XSLT-параметры - хеш строк, доступных из шаблона через <xsl:param … />.

Внимание: Parser (в виде модуля к Apache или IIS) кеширует результат компиляции файла_с_шаблоном во внутреннюю форму, повторная компиляция не производится, а скомпилированный шаблон берется из кеша. Вариант CGI также кеширует шаблон, но только на один запрос. Шаблон перекомпилируется при изменении даты файлов шаблона.









Выдача XHTML


Если необходимо выдать XHTML, следует использовать такие атрибуты элемента <xsl:stylesheet … />:

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

Обратите внимание на указание xmlns без префикса - так необходимо делать, чтобы все создаваемые в шаблоне элементы без префикса попадали в пространство имен xhtml. Необходимо задавать xmlns без префикса в каждом .xsl файле, этот параметр не распространяется на включаемые файлы.

А также необходимо задать такие атрибуты <xsl:output … />:
<xsl:output 
   doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
   doctype-system="DTD/xhtml1-strict.dtd"
   />

Внимание: не задавайте атрибут method. XHTML это разновидность метода xml, включающаяся при использовании следующих doctype:
   -//W3C//DTD XHTML 1.0 Strict//EN
   -//W3C//DTD XHTML 1.0 Frameset//EN
   -//W3C//DTD XHTML 1.0 Transitional//EN