Что такое код xslt_create

Содержание

Что делает этот код XSLT?

Я новичок в XSLT. У меня есть код блока, который я не понимаю.

В следующем блоке, что означают ‘*’,’*[@ и ‘*[@ ?

* соответствует всем элементам, шаблон *[@ ] соответствует всем элементам с атрибутом class значения vcard . Из этого вы можете понять, что может означать *[@ ] ; -)

Я также предлагаю начать здесь.

В вашей таблице стилей есть четыре правила шаблона. На английском языке эти правила:

(a), начиная с вершины (match = «/» ), сначала выведите элемент script, затем обработайте следующий уровень вниз (xsl: apply-templates) на входе.

(b) правило по умолчанию для элементов (match = «*» ) заключается в создании нового элемента на выходе с тем же именем и атрибутами, что и оригинал, и для создания его содержимого путем обработки следующего уровня в вход.

(c) правило для элементов с атрибутом не должно ничего делать с этим элементом, кроме того, чтобы обрабатывать следующий уровень вниз во входе.

(d) правило для элементов с атрибутом заключается в выводе

где X — текстовое содержимое обрабатываемого элемента.

Более опытный пользователь XSLT написал бы последнее правило как

Что такое код xslt_create

(PHP 4 >= 4.0.3, PECL)

xslt_create — Create a new XSLT processor

Description resource xslt_create ( void )

Create and return a new XSLT processor resource for manipulation by the other XSLT functions.

Примеры

Пример 1. xslt_create() example

$path = ‘include’ ;
$arguments = array( ‘/_xml’ => $xmldata );
$xsltproc = xslt_create ();
xslt_set_encoding ( $xsltproc , ‘ISO-8859-1’ );
$html =
xslt_process ( $xsltproc , ‘arg:/_xml’ , «$path/$xsl» , NULL , $arguments );

if (empty( $html )) <
die( ‘XSLT processing error: ‘ . xslt_error ( $xsltproc ));
>
xslt_free ( $xsltproc );
return $html ;
>
?>

Смотрите также


Пред. Начало След.
xslt_backend_version Уровень выше xslt_errno

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Преобразование XML + XSLT с помощью Sablotron

Альтернативное введение в использование XSL Transformations в PHP при помощи Sablotron.

Данный материал следует воспринимать как альтернативное введение в использование XSLT с Sablotron в PHP.

Термины XSL и XSLT близки друг к другу, и новичкам их можно считать синонимами. Подробности, в чём же различия, описаны в спецификации XSL Transformations W3C.

Все, кто интересовался возможностями XSLT, читал стандартный пример из мануала, либо примеры, приводимые в статьях, посвящённых XSLT, на разных сайтах. Работающий пример из этой же серии:

Подобных примеров в Сети полно. Все они хорошо показывают, что XSL-трансформация в php работает, но после их прочтения остаётся неясным, зачем XSL нужен, скорее даже наоборот — почему XSL не нужен.

«Действительно», — подумает читатель, — «если данные лежат в базе, зачем городить огород, формируя сперва XML, а затем ещё преобразовывать через XSL? С тем же успехом это сделает класс HTML-шаблона.»

После этого разочарованный программист напрочь теряет интерес к XSL и вешает на технологию ярлык «ненужная заумь».

Вам, уважаемые читатели, повезло найти такой замечательный сайт, как «php в деталях». Здесь вы прочитаете о том, что XSL может не только преобразовывать XML в HTML, но и то, как можно при помощи XSL облегчить работу с php-скриптами.

Начало работы

Приведённый выше пример, хоть и слишком прост, хорошо иллюстрирует, каким образом делается XSL-преобразование в php.

Чтобы этот код работал, нужно установить XSLT-процессор Sablotron. На виндовой машине это делается так:

1. положить iconv(-1.3).dll, expat.dll и sablot.dll в C:windowsSystem (все файлы есть в стандартном дистрибутиве php)
2. открыть C:windowsphp.ini и в нём найти параметр extension_dir. Если значение параметра — «.» или нечто вроде «./», исправить на, скажем, «f:usrlocalphpextension» (или адрес директории, в которой у вас лежат/будут лежать расширения php). Теперь это будет директория расширений php.
3. положить в директорию расширений файл php_xslt.dll (это для php версии 4.2.x), либо php_sablot.dll (для версии 4.0.x)
4. в php.ini раскомментируйте строчку extension=php_xslt.dll (4.2.x) или extension=php_sablot.dll (4.0.x)

Теория

Использование XSLT позволяет отделить от php-скриптов работу по форматированию и представлению данных. Это не только уменьшение объёма кода, но и вынос большого количества логических конструкций (if, else, switch), а следовательно, облегчение работы по написанию и отладке программ. Смею утверждать, что тот, кто не пробовал работать с XSLT, не представляет себе, насколько php-кодирование облегчится.

Впрочем, не надо обольщаться: если у вас было несколько конструкций if … else в php-скрипте, они, скорее всего, появятся в том же количестве в XSL-файле.

Теперь к примерам.

Вывод списков

Все усложнения, происходящие от необходимости выводить список в удобочитаемом виде, переносятся на плечи XSL. Пример #2. Список статей на сайте с подсветкой статьи, которую читают сейчас, чередование цвета в строках и нумерация списка.

Произвольная разметка

Переводя на XML сайт с текстами (как этот), естественно хотеть сделать собственную разметку статей. Например, в контейнером important выделять очень важные места и иметь возможность выделять их не обязательно жирным шрифтом, но, может быть, цветом, CSS-стилем. Или писать цитаты как текст цитаты и иметь возможность менять стиль их оформления вместе с дизайном сайта.

Медленно продвигаясь от самого простого первого примера, многие натыкаются на эту проблему и не могут найти решения. Ведь если выделить абзац в тег

и делать для него шаблон, на первый взгляд, существуют три способа вывода содержимого:

1. тег xsl:value-of выводит текст, но удаляет все теги в абзаце
2 .тег xsl:copy-of выводит копию всего содержимого (без возможности применять шаблоны к детям — внутренним тегам) и самого контейнера

(что не очень красиво в HTML).
3. наконец, xsl:apply-templates применит шаблоны к детям, но пропустит текст

Проблема кажется безвыходной, но решение есть. Я использую «магические» шаблоны, которые выводят и текст и теги в нём со всеми атрибутами и без изменений. Пример #3:

Первым делом XSLT-процессор при вызове инструкции apply-templates ищет шаблон для каждого элемента. Для элемента strong шаблон есть, и именно в соответствии с ним такие элементы будут обработаны. Для гиперссылки шаблона нет, поэтому она будет выведена, как есть. Можно добавить в XSL шаблон и для ссылки, который бы выводил рядом с каждой текстовой ссылкой картинку для открытия её в новом окне:

* в шаблоне использован параметр match=»a[@href]» — этот шаблон будет применён только к тем тегам ссылок, в которых есть поле href и пропустит якоря ( ).

Невалидный код и

Кажущаяся необходимость писать валидный XML-код так же отпугивает многих неофитов XSLT. Хорошо, с завтрашнего дня будем писать статьи только валидно, благо дома можно проверить, нет ли в тексте XML-ошибки — mismatched tag или invalid token, — с этим как-нибудь справимся. Но ведь, по-хорошему, нужно и весь архив перевести в валидный код! И я так тоже думал, когда появилась возможность переделывать сайт на XML.

Решение проблемы довольно простое: не хочешь — не пиши валидно. Пиши, как привык, — без кавычек в атрибутах тегов, используй простой
и прочее. Достаточно заключить текст в контейнер (пример ниже).

Что касается , то здесь дела такие: элемента nbsp в XML нет. Есть lt, gt, quot, но не nbsp (вполне логично — это ведь non-braking space, который относится к форматированию и придуман для HTML). Поэтому его нужно объявить в документе, либо использовать только внутри .

Очень удобно! Большие изменения в архив вносить не придётся. Можно начать писать валидно, а продолжать как попало. А можно комбинировать эти два подхода. Чтобы не писать в архивные файлы тег CDATA, я сделал простое преобразование при помощи регулярных выражений (важно так же помнить, что один тег CDATA не должен содержать в себе другой).

Циклы

Допустим, нам нужно сделать форму для редактирования статьи, в том числе её даты. Для удобства пользования надо сделать три раскрывающихся списка (далее — «крутилки») — дата от 1 до 31, месяц, год. Первое решение, которое приходит в голову — сделать HTML-код крутилок в php, вставить в XML в контейнере CDATA, а затем вывести в XSL с параметром disable-output-escaping=»yes».

На самом деле, XSLT может и это. Достаточно вставить в данные XML число, номер месяца и год. Крутилки можно нарисовать сразу в XSLT.

Напишем шаблон, не предназначенный ни для какого элемента документа. Он будет вызываться командой xsl:call-template и получать два параметра: значение счётчика и максимум. Сперва он будет выводить нужные нам данные со значением счётчика, затем вызывать самого себя с параметрами максимум и счётчик, увеличенный на 1. Пример #5:

Оставляю вам в качестве домашнего задания шаблон для вывода крутилки с годом.

Резюме

Как видите, многое из того, что пишется в php-скриптах, даже при использовании класса шаблона, можно успешно спустить в XSLT. Но стОит ли заниматься этим?

Ответ зависит от условий работы в вашем проекте. Второй момент — технологичность работы.

Допустим, я захочу сделать на этом сайте меню быстрой навигации — раскрывающийся список со всеми статьями, — чтобы пользователь мог выбрать статью из списка и сразу перейти к ней. Ещё я захочу оставить список последних материалов (сейчас он находится справа вверху).

Если делать это при помощи класса шаблона типа FastTemplate, нужно два специальных блока и дополнительный код в php, который бы объявлял в шаблоне блок для списка всех статей и отдельно блок для списка 10 последних. Аналогичные действия необходимы в таком случае и при работе без класса шаблона. При работе с XML достаточно всего лишь одного набора данных «Дата => Статья», из которого в XSL-документе строятся и листбокс быстрого перехода, и список последних статей.

А если вдруг понадобится неважно для чего сделать другое оформление сайта (например, версия для WAP, или просто редизайн), в котором будет решено отказаться от списка 10 последних материалов. В случае первых двух технологий — класс шаблона и смешанный код — нужно будет убрать часть php кода, в случае XSLT изменения коснутся только XSL-файла. Такой процесс более технологичен, поскольку невозможно сделать новые ошибки в php-скриптах (а теперь представьте обратный случай — списка 10 последних статей не было, но его решили добавить!).

Итак, выбор остаётся за вами, а я как мог привёл сильные стороны технологии и доводы в пользу использования XML в проектах.

xslt_create

xslt_create — Create a new XSLT processor

Описание

Create and return a new XSLT processor resource for manipulation by the other XSLT functions.

Возвращаемые значения

Returns an XSLT processor link identifier on success, or FALSE on error.

Примеры

Пример #1 xslt_create() example

function xml2html ( $xmldata , $xsl )
<
/* $xmldata -> your XML */
/* $xsl -> XSLT file */

$path = ‘include’ ;
$arguments = array( ‘/_xml’ => $xmldata );
$xsltproc = xslt_create ();
xslt_set_encoding ( $xsltproc , ‘ISO-8859-1’ );
$html =
xslt_process ( $xsltproc , ‘arg:/_xml’ , » $path / $xsl » , NULL , $arguments );

if (empty( $html )) <
die( ‘XSLT processing error: ‘ . xslt_error ( $xsltproc ));
>
xslt_free ( $xsltproc );
return $html ;
>
?>

Что такое код xslt_create

Для того, чтобы работать с данным документом, вам необходимо располагать как минимум браузером Internet Explorer версии 5.0 и выше. При этом будут работать некоторые из приведенных в тексте примеров.

Для того, чтобы у вас работали все примеры, необходимо установить XML-парсер версии 3. Если пример работает только под управлением XML-парсера версии 3, то в каждом случае это оговаривается особо. Отметим, что версии IE вплоть до 5.5 используют более ранние версии парсера, поэтому устанавливать его все равно придется. О более старших версиях IE узнайте самостоятельно.
Дистрибутив XML-парсера версии 3 можно найти по адресу http://msdn.microsoft.com/ XML/ XMLDownloads/ default.aspx.
После установки парсера вам нужно будет зарегистрировать его в реестре. Для этого в командной строке необходимо выполнить команду: regsvr32 msxml3.dll . Затем необходимо сообщить IE, что вы намерены использовать этот парсер. Для этого нужно запустить утилиту xmlinst . Утилиту xmlinst можно найти по адресу http://msdn.microsoft.com/ library/ default.asp?url=/ downloads/ list/ xmlgeneral.asp. Вы можете также попробовать найти ответы на вопросы об установке XML-парсера по адресу http://www.netcrucible.com/xslt/msxml-faq.htm.

А теперь перейдем к основной части нашего документа.

Введение

Рассмотрим простой пример XML-файла (ex01.xml).

tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >

Если мы откроем этот файл в браузере Internet Explorer, то мы увидим тот же самый текст, который приведен выше, вместе со всеми тегами и служебной информацией. Но нам не нужны теги и служебная информация! Мы хотим видеть только ту информацию, которая относится к делу, а при помощи тегов — управлять внешним видом этой информации. Эта задача решается легко и просто: необходимо к XML-файлу добавить шаблон преобразования — XSL-файл.

Перепишем наш XML-файл в следующем виде (ex01-1.xml).

tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >

И создадим XSL-файл ex01-1.xsl. Текст файла приведен ниже.

xsl:stylesheet version =» 1.0 » xmlns:xsl =» http://www.w3.org/TR/WD-xsl «>
xsl:template match =» / «>
p > strong > xsl:value-of select =» //title «/> strong > p >
p > xsl:value-of select =» //author «/> p >
xsl:template >
xsl:stylesheet >

Если мы теперь откроем файл ex01-1.xsl в браузере Internet Explorer, то мы увидим, что наша задача решена, — на экране осталась только необходимая нам информация, все теги исчезли. Результат, который вы получите на экране браузера, приведен ниже.

«Заметки об XSL»

Леонов Игорь Васильевич

Легко также увидеть, что порядок вывода строк у нас определяется только содержанием шаблона преобразования — XSL-файла. При необходимости шаблон можно легко поменять, абсолютно не меняя наш основной XML-файл.

Перепишем XML-файл. Информационную часть изменять не будем, а шаблон укажем другой ex01-2.xml.

tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >

Создадим XSL-файл ex01-2.xsl. Текст файла приведен ниже.

xsl:stylesheet version =» 1.0 » xmlns:xsl =» http://www.w3.org/TR/WD-xsl «>
xsl:template match =» / «>
p > strong > xsl:value-of select =» //author «/> strong > p >
p > xsl:value-of select =» //title «/> p >
xsl:template >
xsl:stylesheet >

Если мы теперь откроем файл ex01-2.xsl в браузере Internet Explorer, то результат будет другим.

Леонов Игорь Васильевич

«Заметки об XSL»

Отметим теперь момент, который является ключевым для разработчиков баз данных. Информация в XML-странице появляется, как правило, в результате запроса к базе данных. Запрос к базе данных в многопользовательской среде — это весьма дорогостоящая операция. Предположим теперь, что у нас нет XML и мы формируем стандартные статические HTML-страницы. В этом случае для решения задачи простого преобразования внешнего представления информации, например, для изменения сортировки, у нас есть два способа решения проблемы: выполнить запрос и сохранить результаты в каком-либо временном буфере на сервере или каждый раз при изменении внешнего представления выполнять новый запрос и формировать HTML-страницу заново.

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

XML и XSL — это исчерпывающее решение описанной выше проблемы. Фактически XML-страница — это и есть временный буфер для результатов запросов. Только вместо нестандартного и трудоемкого программирования мы теперь используем стандартный механизм XSL.

Есть и еще одно соображение, которое может быть существенным для разработчиков баз данных. Большинство современных СУБД могут форматировать результаты запроса к базе данных в виде XML-файла. То есть при построении интерфейса пользователя в рамках технологии XML и XSL мы добиваемся определенной независимости от поставщика СУБД. В части организации вывода — практически полной независимости. А эта часть весьма велика в большинстве прикладных систем, ориентированных на работу с базами данных. Конечно, помимо вывода есть еще ввод и серверная обработка бизнес-логики, но здесь вам придется искать какие-то иные решения.

Первые шаги

Разберем теперь более подробно первый пример. Напомним его текст.

tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >

Первая строка информирует браузер о том, что файл имеет формат XML. Атрибут version является обязательным. Атрибут encoding не является обязательным, но если у вас в тексте есть русские буквы, то необходимо вставить этот атрибут, в противном случае XML-файл просто не будет обрабатываться, — вы получите сообщение об ошибке.

Следующие строки — это тело XML-файла. Оно состоит из элементов, которые в совокупности образуют древовидную структуру. Элементы идентифицируются тегами и могут быть вложены друг в друга.

Элементы могут иметь атрибуты, значения которых тоже могут обрабатываться в соответствии с шаблоном.

На верхнем уровне XML-файла всегда находится один элемент. То есть файл вида

tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >
tutorial >
title > «Введение в CSP» title >
author > Леонов Игорь Васильевич author >
tutorial >

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

knowledgeDatabase >
tutorial >
title > «Заметки об XSL» title >
author > Леонов Игорь Васильевич author >
tutorial >
tutorial >
title > «Введение в CSP» title >
author > Леонов Игорь Васильевич author >
tutorial >
/knowledgeDatabase >

Отметим, что имена тегов чувствительны к регистру символов. Подробнее об этом можно прочесть в любой книге по XML — элементам и атрибутам в этих книгах уделяется достаточно большое внимание.

Перейдем теперь к шаблону преобразования — к XSL-файлу. Задача XSL-файла — преобразовать дерево XML-файла в другое дерево, которое, например, будет соответствовать формату HTML и может быть изображено на экране браузера с учетом форматирования, выбора шрифтов и т.п.

Для того, чтобы браузер выполнил необходимое преобразование, нужно в XML-файле указать ссылку на XSL-файл

Рассмотрим теперь текст XSL-файла

xsl:stylesheet version =» 1.0 » xmlns:xsl =» http://www.w3.org/TR/WD-xsl «>
xsl:template match =» / «>
p > strong > xsl:value-of select =» //title» «/> strong > p >
p > xsl:value-of select =» //author «/> p >
xsl:template >
xsl:stylesheet >

Первая строка файла содержит тег элемента xsl:stylesheet . Атрибуты элемента — номер версии и ссылка на пространство имен. Эти атрибуты элемента xsl:stylesheet являются обязательными. В нашем случае пространство имен — это все имена элементов и их атрибутов, которые могут использоваться в XSL-файле. Для XSL-файлов ссылка на пространство имен является стандартной.

Заметим, что XSL-файл является одной из разновидностей XML-файлов. Он не содержит пользовательских данных, но формат его тот же самый. Файл содержит элемент верхнего уровня xsl:stylesheet , а далее идет дерево правил преобразования.

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

В дальнейшем тексты XML- и XSL-файлов мы будем приводить в черно-белом варианте. Вы всегда сможете открыть реальный файл и посмотреть все в цвете. При необходимости закомментируйте ссылку на XSL-файл. Синтаксис комментария следующий — . В текст комментария нельзя вставлять символы — .

В первом примере мы посмотрели, как с помощью элемента xsl:value-of можно вывести в HTML-формате содержание элемента (текст, заключенный между тегами). Теперь мы посмотрим, как при помощи того же самого элемента можно вывести значение атрибута элемента.

Рассмотрим следующий XML-файл ex02-1.xml

В этом файле информация хранится не в содержании элементов, а в виде значений атрибутов. Файл ex02-1.xsl имеет вид

Обратите внимание на синтаксис ссылки на атрибут элемента — //dog/@name . Имя элемента и имя атрибута разделены парой символов » /@ «. В остальном синтаксис тот же самый, что и для ссылки на содержание элемента.

Результат имеет следующий вид:

Собака: Шарик. 18 кг, рыжий с черными подпалинами.

Обратим теперь внимание на следующий момент. В XSL-файле мы никак не использовали элемент tutorial . На самом деле можно было использовать полный путь. Перепишем наш XML-файл, увеличив глубину дерева (ex02-2.xml)

Файл ex02-2.xsl имеет вид

Результат будет тем же самым.

Собака: Шарик. 18 кг, рыжий с черными подпалинами.

В этом примере мы использовали полную ссылку для значений атрибутов. При выводе одиночных значений оба варианта — полная и сокращенная ссылка — работают одинаково.

На этом мы закончим разбор примеров с выводом одиночных значений и перейдем к выводу табличной информации — к выводу результатов запроса.

Вывод результатов запроса

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

Рассмотрим следующий XML-файл — ex03.xml. Текст его приведен ниже.

Предположим, что это результат запроса к базе данных и выведем на экран соответствующую таблицу.

Простая таблица

Первый шаг — это, как всегда, добавление шаблона преобразования. Модифицируем наш файл, добавив в него ссылку на шаблон. В результате получим файл ex03-1.xml.

В этот файл добавлен шаблон преобразования ex03-1.xsl.

Рассмотрим этот шаблон подробнее. Вот его текст.

Кличка Вес Цвет

Первая строка — новая для вас в XSL-файле (но не в XML-файлах!). Она говорит о том, что в XSL-файле нужно нормально воспринимать русские буквы. Без этой строки браузер не сможет корректно обработать русский текст в XSL-файле. Следующие две строки шаблона являются уже привычными. Следующие шесть строк — это строка, содержащая заголовки столбцов таблицы. Конструкция для извлечения текста заголовков таблицы вам уже знакома. А вот десятая строка тоже является новой:

Этот элемент шаблона позволяет выбрать и просмотреть все группы информации, полный путь к которым задается списком тегов «tutorial/enimals/dogs/dog» . Обратите внимание — путь задается полностью, ни один из тегов опустить нельзя. Далее в ячейки таблицы помещается информация о наших собаках. В отличие от первых примеров путь к соответствующей информации тоже задается полностью. Попробуем, например, разместить информацию о кличке чуть-чуть иначе ex03-2.xml:

Если мы в соответствующем XSL-файле поставим ссылку , то в соответствующем столбце никакой клички мы не увидим. Ссылка должна быть полной — . Вы можете самостоятельно поэкспериментировать с файлом ex03-2.xsl. Правильный результат приведен ниже.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Тузик 10 кг белый с черными пятнами
Бобик 2 кг бело-серый
Трезор 25 кг черный

Сортировка

В предыдущих примерах порядок строк в таблице полностью соответствовал группам тегов в XML-файле. Этот порядок можно изменять. Добавим в тег

Кличка Вес Цвет
Бобик 2 кг бело-серый
Трезор 25 кг черный
Тузик 10 кг белый с черными пятнами
Шарик 18 кг рыжий с черными подпалинами

Более интересные результаты мы получим, если попытаемся отсортировать таблицу по столбцу «Вес». Вначале попробуем сделать по аналогии с предыдущим примером — атрибут order-by=»dogName» заменим на order-by=»dogWeight» . Результат приведен ниже (ex03-4.xml, ex03-4.xsl).

Кличка Вес Цвет
Тузик 10 кг белый с черными пятнами
Шарик 18 кг рыжий с черными подпалинами
Бобик 2 кг бело-серый
Трезор 25 кг черный

Таблица действительно отсортирована по столбцу «вес», но это не числовая, а строковая сортировка! Для того, чтобы браузер воспринял значения как числа, ему необходимо об этом сказать, — вместо order-by=»dogWeight» необходимо написать order-by=»number(dogWeight)» . Теперь мы получили правильный результат (ex03-5.xml, ex03-5.xsl).

Кличка Вес Цвет
Бобик 2 кг бело-серый
Тузик 10 кг белый с черными пятнами
Шарик 18 кг рыжий с черными подпалинами
Трезор 25 кг черный

Приведем теперь пример сортировки по нескольким столбцам. Различные элементы в атрибуте order-by должны разделяться символом » ; » — order-by=»number(dogWeight); dogName» (ex03-6.xml, ex03-6.xsl). Таблица приведена ниже.

Кличка Вес Цвет
Трезор 10 кг черный
Тузик 10 кг белый с черными пятнами
Бобик 18 кг бело-серый
Шарик 18 кг рыжий с черными подпалинами

Следующий пример работает только под управлением XML-парсера версии 3. В нем строки сортируются по одному столбцу — по кличке собаки. Этот пример уже приводился выше, однако теперь мы используем новый синтаксис (ex03-7.xml, ex03-7.xsl).

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

Это очень важный момент, и его никогда нельзя упускать из виду.

Кроме того, мы убрали атрибут order-by в элементе xsl:for-each и добавили другой элемент

Если элемент xsl: sort присутствует в элементе xsl:for-each , то он всегда должен стоять сразу после элемента xsl:for-each . Синтаксис элемента xsl:sort достаточно очевиден. В нем используются два атрибута: атрибут order — способ сортировки (по возрастанию или по убыванию) и атрибут select — имя поля, по которому производится сортировка. Если нам нужно отсортировать по первому элементу, как в данном примере, то вместо » dogName » можно было поставить точку — » . «, для других элементов нужно указывать его имя, например » dogColor «, если нам нужно отсортировать записи по цвету собаки. На самом деле атрибутов может быть пять — select , lang , data-type , order и case-order , но мы не будем здесь рассматривать все эти атрибуты, поскольку здесь мы не преследуем цель дать полное описание всех элементов, используемых в XSL, и их атрибутов.

Таблица результатов приведена ниже.

Кличка Вес Цвет
Бобик 2 кг бело-серый
Трезор 25 кг черный
Тузик 10 кг белый с черными пятнами
Шарик 18 кг рыжий с черными подпалинами

С использованием нового синтаксиса легко сменить сортировку по возрастанию на сортировку по убыванию (ex03-8.xml, ex03-8.xsl). Этот пример работает только под управлением XML-парсера версии 3.

Разница заключается в одной строке

Мы изменили значение атрибут order — значение ascending заменено на descending .

Таблица результатов приведена ниже.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Тузик 10 кг белый с черными пятнами
Трезор 25 кг черный
Бобик 2 кг бело-серый

Покажем теперь сортировку по нескольким полям (ex03-9.xml, ex03-9.xsl). Этот пример работает только под управлением XML-парсера версии 3.

В этом примере у нас фигурируют две строки с элементом xsl:sort .

Строки вначале сортируются по весу собаки, а затем по их кличкам в алфавитном порядке. Обратите внимание — для того, чтобы сортировка выполнялась в числовой последовательности, в элемент xsl:sort мы добавили атрибут data-type . Таблица результатов приведена ниже.

Кличка Вес Цвет
Волчонок 3 кг темно-серый
Трезор 10 кг черный
Тузик 10 кг белый с черными пятнами
Бобик 18 кг бело-серый
Шарик 18 кг рыжий с черными подпалинами

Заменив значение атрибута order by на descending , мы легко сгруппируем записи о собаках с одинаковым весом так, что клички будут идти в обратном алфавитном порядке. Соответствующий пример вы легко построите сами.

Кличка Вес Цвет
Волчонок 3 кг темно-серый
Тузик 10 кг белый с черными пятнами
Трезор 10 кг черный
Шарик 18 кг рыжий с черными подпалинами
Бобик 18 кг бело-серый

Элемент XSL:IF — фильтр

Рассмотрим теперь способы фильтрации строк таблицы. Первый пример использует старый синтаксис. В нем условие фильтрации указывается непосредственно в атрибуте select (ex04-1.xml, ex04-1.xsl).

Ниже приведена строка, в которую мы внесли необходимые изменения.

xsl:for-each select=»tutorial/enimals/dogs/dog [dogWeight$gt$10] » order-by=»number(dogWeight); dogName;»>

И таблица результатов.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Трезор 25 кг черный

Вы видите, что в таблице остались только те собаки, чей вес превышает 10 кг, причем первым стоит Шарик, чей вес меньше.

Все дальнейшие примеры в этом параграфе работают только под управлением XML-парсера версии 3.

Более гибкие возможности нам предоставляет новый синтаксис (ex04-2.xml, ex04-2.xsl). Обратите внимание — в новом синтаксисе атрибут order-by в элементе xsl:for-each не поддерживается, вместо него мы вставили два элемента xsl:sort .

Кроме того, условие фильтра у нас вынесено в отдельный элемент xsl:if .

Не забывайте указывать конечный тег элемента xsl:if .

В этом примере таблица результатов полностью аналогична предыдущей.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Трезор 25 кг черный

Полностью преимущества нового синтаксиса проявляются при использовании функций.

Рассмотрим следующий пример (ex04-3.xml, ex04-3.xsl). В этом примере используется функция position() , определяющая порядковый номер фрагмента в исходном XML-файле.

Соответствующий элемент xsl:if .

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Тузик 10 кг белый с черными пятнами

Продемонстрируем теперь использование более интересных функций — start-with(string,startSubstring) и contains(string,anySubstring) . Функция start-with(string,startSubstring) проверяет, начинается ли строка string с подстроки startSubstring . Пример — ex04-4.xml, ex04-4.xsl).

Синтаксис элемента xsl:if .

В этом элементе мы использовали переменные. Значения переменных были инициализированы ранее

Переменная varStartWith представляет собой подстроку, с которой должны начинаться требуемые нам клички. Она не меняется, поэтому инициализируется перед циклом. Переменная varDogName содержит кличку собаки, она меняется на каждом шаге цикла и, соответственно, инициализируется в теле цикла.

Кличка Вес Цвет
Тузик 10 кг белый с черными пятнами
Трезор 25 кг черный

Функция contains(string,anySubstring) проверяет, содержит ли строка string подстроку anySubstring . Пример — ex04-5.xml, ex04-5.xsl.

Синтаксис элемента xsl:if .

Этот пример полностью аналогичен предыдущему.

Кличка Вес Цвет
Бобик 2 кг бело-серый
Трезор 25 кг черный

Два элемента xsl:if , вложенные друг в друга, дают нам эффект оператора AND (ex04-6.xml, ex04-6.xsl).

Соответствующий фрагмент XSL-файла.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами

Можно добиться и эффекта оператора OR. Для этого нам нужно включить два цикла, в каждом из которых формируется своя выборка (ex04-7.xml, ex04-7.xsl).

Соответствующий фрагмент XSL-файла.

Кличка Вес Цвет
Бобик 2 кг бело-серый
Шарик 18 кг рыжий с черными подпалинами
Трезор 25 кг черный

Если сортировка не требуется, то можно вставить два элемента xsl:if в один элемент xsl:for-each .

Элемент XSL:IF — улучшение внешнего вида таблиц

Элемент xsl:if можно применять не только для фильтрации строк выборки. Очевидно, что он может быть полезен и во многих других областях. В этом параграфе мы разберем пример использования элемента xsl:if для улучшения внешнего вида таблицы. Заодно мы продемонстрируем реальное использование функции position() . Мы будем использовать эту функцию для того, чтобы чередовать цвет четных и нечетных строк таблицы (ex04-8.xml, ex04-8.xsl).

Фрагмент XSL-файла, который отвечает за требуемое чередование.

position() mod 2 = 0 «>
#CCCCCC

С элементом xsl:if и с функцией position() мы уже знакомы. Оператор mod дает нам остаток от деления на 2. А элемент xsl:attribute позволяет нам динамически подставлять в файл результатов различные атрибуты. Это очень мощный элемент, мы разберем еще одно применение этого элемента в следующем параграфе. А сейчас приведем для полноты картины таблицу результатов.

Кличка Вес Цвет
Шарик 18 кг рыжий с черными подпалинами
Тузик 10 кг белый с черными пятнами
Бобик 2 кг бело-серый
Трезор 25 кг черный

Динамическое формирование атрибутов на примере параметров ссылки в теге

Предположим теперь, что в каждой строке таблицы нам нужно сделать ссылку на некоторую страницу и передать на эту страницу два параметра — кличку и вес собаки. Понятно, что для каждой строки эти параметры — свои, и их нельзя прописать явно в XSL-файл. Тем не менее задача легко решается при помощи элемента xsl:attribute .

Мы не будем здесь строить специальный пример, ограничимся только соответствующим фрагментом XSL-файла.

И, наконец, мы ознакомились с комментариями в XSL-файлах. Это вторая строка приведенного фрагмента.

На этом мы завершим рассмотрение возможностей чистого XSLT и перейдем к последнему параграфу в этом документе — к динамическому изменению содержимого Web-страницы при помощи возможностей JavaScript и XML/XSLT без каких-либо дополнительных обращений к базе данных.

JavaScript и XML

Объединим теперь наши знания XML с возможностями, которые нам предоставляет JavaScript. Предположим, что нам нужно иметь возможность динамически изменять сортировку столбцов таблицы при щелчке на заголовке того или иного столбца. Понятно, что для этого нам нужно иметь один XML-файл, содержащий строки таблицы, несколько XSL-файлов, каждый из которых содержит требуемую сортировку и нечто, что объединит это все вместе и заставит работать.

Перейдем к реализации этой программы.

В качестве XML-файла возьмем привычный нам файл со списком собак — ex05-1.xml. Обратите внимание — мы убрали из файла ссылку на XSL-файл — нам нужно менять шаблон преобразования динамически.

Создадим также три XSL-файла, в каждом из которых у нас будет свой элемент xsl:sort , задающий сортировку строк — ex05-1a.xsl, ex05-1b.xsl, ex05-1c.xsl.

Приведем здесь текст элемента xsl:sort для каждого файла

Теперь нам осталось только объединить все это вместе. Ниже мы полностью приводим текст файла ex05-1.htm, сопроводив его необходимыми комментариями.

При загрузке страницы создадим все необходимые объекты и выведем первоначальный вариант на экран.

Использование XSLT для чтения из одного источника HTML и создать новый HTML-страницу?

Я пытаюсь узнать, как использовать XSLT для чтения из одного источника HTML и создать новый HTML-страницу. Я знаю, что некоторые об использовании XSLT для чтения из файла XML и создать новый HTML-страницу, но другой способ является новым для меня, и я не могу найти какие-либо полезные учебные пособия по данной теме.

Я loking некоторых базовых знаний об этом, чтобы быть в состоянии начать, но я не знаю, как думать и использовать XSLT, чтобы, например, выберите дивы и его содержимое из исходного HTML и создать новый HTML и, возможно, создать новую страницу без головы теге и так далее.

Оценивают некоторую базовую помощь или хорошие ссылки по этой теме. Благодаря! :)

Привет еще раз! Это моя задача и проблема, что мне нужна помощь, чтобы решить, если это возможно ?! У меня есть один документ XHTML, которая использует CSS стилей. Давайте назовем документ XHTML для «B». Я хочу, чтобы создать новый документ XHTML, давайте называть это «А», а также использовать некоторые дивы с «В» на «А» с новым CSS стилей. Это как если кто-то нажмите на кнопку «B», они пришли к «А» вместо этого. Ммм, и я не знаю, с чего начать, и я не знаю, возможно ли это? Как добавить CSS стилей в код XSLT? Может быть, никто не понял, что я говорю, но не стесняйтесь спрашивать. Оценивает все помогают, что я могу решить эту задачу! Заранее спасибо! :)

При преобразовании из XHTML в (X) HTML, с точки зрения процессора, вы можете первым, чтобы избежать внешнего разрешения синтаксического анализа фазы, вызванного DOCTYPE, как это может быть источником ошибок во время выполнения.

В таком случае вы должны увидеть, если ваш процессор поддерживает любые варианты, чтобы отключить, что или вы, возможно, потребуется удалить объявление DOCTYPE из входного документа непосредственно.

Например , в msxsl вы можете использовать xe опции , чтобы отключить внешние разрешения DOCTYPE:

С точки зрения XSLT 1.0 , ваш XHTML это просто XML документ с определенным пространством имен. Например:

Для того, чтобы быть в состоянии преобразовать это в другой документ XHTML ваш XSLT должен:

  • объявить правильное пространство имен по умолчанию и префикс
  • объявить правильный вывод и доктайп

Вы получите доступ к элементам в исходном документе, используя определенный префикс. Например, это преобразование просто добавить заголовок входного документа:

  • объявление префикса пространства имен xmlns:x=»http://www.w3.org/1999/xhtml» позволяет правильно выбрать элементы во входном документе, аттестованы в пространстве имен XHTML.
  • декларация пространства имен по умолчанию xmlns=»http://www.w3.org/1999/html» предотвращает образование нежелательных пустых пространств имен xmlns=»» в выходном документе.
  • использование exclude-result-prefixes позволяет исключить объявление пространства имен XHTML в элементах выходного документа явно объявленных в XSLT.

С точки зрения XSLT 2.0 , это действительно очень просто. Вы можете объявить пространство имен XPath по умолчанию, таким образом , чтобы избавиться от префиксов. Декларация стилей будет:

Ulric Wilfred’s wiki

Let the wiki begin.

Облако тегов

Дерево навигации

Системные страницы

Добавить страницу

(X-Task: «On your Client! Get XML! Get XSL! Do XHTML! Go!»)

Вступление

Статья рассматривает преобразование XML в XHTML посредством XSLT на клиенте средствами JavaScript. К примеру, у вас есть какие-либо данные в виде XML, а вам требуется по какому-либо действию клиента (по клику на ссылке), оформить их в [X]HTML и динамически вставить в страницу. Это не так сложно, но по пути, как оказалось, встречается несколько подводных камней — в основном, относительно кросс-браузерности этого подхода и малой освещённости процесса в сети. Генерация XHTML-страниц средствами браузера (прямой запрос на XML файл, содержащий информацию о стиле) — это другая тема, она намного проще, и здесь затронута не будет.

Задача будет рассмотрена на банальном примере личного сайта. Дано: Файл с контактными данными (XML), некая главная страница (XHTML) и пять браузеров: Firefox 3, Opera 9.5, IE7, Safari 3, Google Chrome. На главной странице есть ссылка, при нажатии которой контактные данные преобразуются в несортированный список (UL) и отображаются в специально выделенной области прямо на этой странице. Это реальный рабочий пример, который я сейчас использую для создания своего сайта (ещё не выложенного).

Контактные данные, при их большом количестве, можно сгруппировать, поэтому XML-схема построена с учётом группировки элементов. Группа имеет краткое имя (shortname) для создания id у списка (возможно, потребуется оформить каждую группу по-особому) и, собственно, имя группы. XML-файл может содержать contact-ноды и вне групп, но в данном примере в этом нет необходимости. Все контакты имеют тип (type) для создания корректных ссылок в будущем (это мы также опустим). С остальным, вроде бы, всё понятно:

Структура довольно-таки проста, поэтому приведу сразу пример файла (любое сходство с реальными данными какого-либо индивидуума полностью случайно и приведено не намеренно):

Стиль генерирует XHTML-код, в виде списка UL, состоящего из негруппированных контактов и вложенных списков для групп. Поскольку результат вывода именно X HTML, требования к оформлению результата несколько строже, чем если бы это был обычный HTML. Поэтому следует обратить внимание на следующие моменты:

  • Важно: В результате преобразования должен получаться файл с одной и только одной корневой нодой, иначе Safari и Google Chrome (Читай: WebKit) не смогут добавить результирующий элемент в документ. Это довольно разумно, поскольку для всех XML объектов (результат в виде XHTML из их числа) есть правило: корневой элемент должен быть только один (There can be the only one).
  • Важно: В качестве xsl:output method должен быть указан либо xml либо html (однако, в последнем случае, при использовании пронстранств имён, таковые будут потеряны). Некоторые ставят это значение в xhtml и в результате получают некорректную обработку или ошибки на клиенте — пока этого метода не введено и не следует его использовать. Для этого есть media-type.
  • Код генерируется без заголовков XML: omit-xml-declaration установлен в yes и xmlns не указывается, иначе в результате получится недоXHTML-файл с XML-заголовком, не содержащий html, head и body. Генерация DOCTYPE (doctype-system, doctype-public) также отключена.

В результате преобразования получается такой блок XHTML:

JavaScript

Настало время выполнить само преобразование на стороне клиента. В этом абзаце придётся использовать немного больше хитростей, ввиду того, что каждый браузер предлагает это делать по-своему.

Загрузка XML-файлов

Для начала нам потребуется загрузить оба файла — XML и XSLT. По своей природе они оба — файлы XML, Internet Explorer предоставляет для этих целей ActiveX-объект XMLDOM, Firefox и Opera — фунцию createDocument, позволяющую загрузить XML-файл в созданный объект. Safari и Chrome (Читай: WebKit), однако, предоставляя эту же функцию, возвращают объект, не поддерживающий загрузку — опять же, вполне разумно, в соответствии со спецификациями W3C.

Метод 1. XMLHttpRequest

Поэтому, плюнув на всё, мы можем загружать файлы через XMLHttpRequest (синхронный или нет — по вашему выбору), используя всем известный шаблон AJAX.

Предложу вам свою версию, вы же можете использовать какую только заблагорассудится. Моя версия отличается тем, что принимает в параметры функцию, которая будет вызвана при успешном завершении вызова, позволяет делать и POST и GET запросы, позволяет передавать объекты и позволяет делать синхронный вызов (тогда она возвращает объект по его завершению).

При использовании этого метода, функция загрузки XML будет выглядеть довольно просто — например, так:

Метод 2. В зависимости от браузера

Однако, если вы хотите использовать именно те способы, которые (как ни забавно) рекомендуются на W3Schools, функцию loadXML придётся усложнить, потому что приведённые на W3Schoolds примеры не работают на браузерах WebKit (Читай: Safari и Chrome). Пусть это будет, так сказать, «рекомендованный вид». Подозреваю, правда, что все эти обходы скрывают под собой те же вызовы XMLHttpRequest, поэтому, если вы не сторонник неоправданных действий, пропустите этот раздел.

Итак, функция будет делать прямой синхронный вызов XHMHttpRequest (вернее, функции описанной в предыдущем разделе) только в случае вызова из Safari, в остальных же случаях прибегать к средствам конкретного браузера (Не забываем правило: Никаких прямых проверок браузера, только проверка, поддерживается ли вызываемая функция):

В результате, функция возвращает XML-объект по заданному имени файла. Можно приступать собственно к трансформации.

Преобразование через XSLT

Преобразованием будет заниматься ещё одна функция, которая будет принимать в качестве аргументов пути к XML-файлу и XSL-файлу. Загружать эти файлы она будет описанной выше функцией loadXML. А возвращать эта функция будет строку с XHTML-кодом, который можно будет вставить прямо в innerHTML нужного элемента.

Почему строку? Потому что метод transformFragment объекта XSLTProcessor не поддерживает рендеринг XML (xsl:output method="xml"), а поддерживает только HTML (xsl:output method="html"). В результате преобразования с xsl:output method="xml" и transformFragment генерируется корректный DocumentFragment, который, однако, при вставке в XHTML-код действует как некая XML-нода — поэтому визуально виден только, так называемый, plain text. Если вас не смущает потеря пространств имён, вы можете изменить xsl:output method на html и использовать transformFragment, добившись в результате, чтобы функция возвращала DocumentFragment.

В случае Internet Explorer используется функция transformNode XML-объекта, в остальных браузерах используется XSLTProcessor.

Всё, весь необходимый код готов и вы можете использовать функцию getStylingResult для преобразования XML-файлов и вставки результата в XHTML. Например, таким образом:

Как итог, мы получили действительно кросс-браузерную версию обработки XML на клиенте. Спасибо за внимание.

Элемент xsl:key

Похожие главы из других книг

Элемент

Элемент Элементы позволяют определять несколько заданий (независимо выполняющихся частей) в одном WS-файле. Иначе говоря, между тегами и будет находиться отдельный сценарий (который, в свою очередь, может состоять из нескольких частей,

Элемент

Элемент Внутри элемента приводится текст из одной или нескольких строк, в котором можно описать примеры запуска сценария. Если сценарий был запущен с ключом /? в командной строке или в сценарии встретился вызов метода ShowUsage объекта WshArguments, то этот текст

Элемент

Элемент При помощи элемента осуществляются проверки условия и принимаются действия на основе результата проверки. Он во многом похож на оператор if в языках программирования. У элемента один атрибут:• test (обязательный). Устанавливается в

Элемент

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

Элемент

Элемент xsl:value-of

Элемент xsl:if

Элемент xsl:if Синтаксис элемента следующий: Элемент xsl:if является простейшим условным оператором в XSLT. Выражение, содержащееся в обязательном атрибуте test, вычисляется и приводится к булевому типу. В том и только том

Элемент xsl:for-each

Элемент xsl:key

Элемент Form

Элемент Form Элемент Form является контейнером для элементов управления и является рабочей площадкой для создания пользовательского интерфейса программы. Класс Form имеет несколько свойств, которые могут различаться в зависимости от выбранной целевой

Элемент Button

Элемент Button Для создания обычной кнопки используется класс System.Windows.Forms.Button. Эта кнопка обладает всеми основными функциями, которые есть у такого же класса в полной версии .NET Framework. Кнопка предназначена для обработки нажатия стилуса на соответствующую область экрана. В

Элемент TextBox

Элемент TextBox В предыдущем примере дата отображалась в текстовом поле. Это поле создается при помощи класса TextBox, который позволяет вводить текст. Данный элемент поддерживает такие стандартные свойства, как BackColor и ForeColor. Событие Click элементом TextBox не поддерживается, но

Элемент TrackBar

Элемент TrackBar Элемент управления TrackBar предназначен для установки числового значения при помощи перемещения ползунка по числовой шкале. Основную работу с элементом разработчик выполняет при помощи свойств Minimum, Maximum и Value. Ползунок может располагаться как вертикально, так

Элемент

Элемент Элементы – это любые единичные компоненты структуры, например, заголовок, абзац текста, фотография или

Точечный элемент

Точечный элемент Snap to Node – привязка к геометрическому объекту «точка» , сформированному командой POINT.Точки, входящие в определение блока, после его вставки могут служить узлами

Элемент

Элемент Основой языка HTML является элемент. Он несет в себе определенную информацию, может описывать документ в целом или способ форматирования текста. Элементы можно назвать основой построения сайта. Все, что вы захотите создать на вашей странице, будет сделано с помощью

CVI. Функции XSLT

XSLT (Extensible Stylesheet Language (XSL) Transformations) это язык трансформации XML-документов в другие XML-документы. Это стандарт, определённый консорциумом World Wide Web (W3C). Информацию о XSLT и связанных технологиях можно найти на http://www.w3.org/TR/xslt.

Это расширение использует Sablotron и expat, которые находятся на http://www.gingerall.com/. Имеются как экзешники, так и исходный код.

В UNIX запустите configure с опциями —enable-xslt —with-xslt-sablot . Библиотека Sablotron должна быть установлена там, где ваш компилятор может её найти.

Это расширение PHP предоставляет не зависящий от процессора API для трансформаций XSLT. В настоящее время это расширение поддерживает только библиотеку Sablotron от Ginger Alliance. Планируется поддержка и других библиотек, таких как библиотеки Xalan или libxslt.

Как запустить преобразование XML (XSLT) с помощью кода C #? Как передать параметры («параметры») в XSLT?

Это вопрос, который я разместил:

Привет, у меня есть XSLT-код, который должен принимать параметры (скажем, один или два) из кода C # .. (Если вы хотите знать, почему я должен это сделать, то позвольте мне объяснить, я должен проанализировать входной XML из определенное внешнее приложение, однако мне нужно отредактировать данные некоторых тегов, принимая значения некоторых других приложений, которые могут быть определены в сложном коде C #, мне не нужно об этом беспокоиться) .. пока и для демонстрационных целей, Мне нужно объявить некоторые строки и передать их в XSLT после действия запуска преобразования.

Я пытался найти в Google, но не получилось. Если вы узнаете что-нибудь об этом, пожалуйста, пришлите мне соответствующую ссылку или информацию ..

Поскольку я не знаком с C # (вот причина, которая застряла с проблемой), простое кодирование очень помогло бы ..

А также, пожалуйста, укажите, какой «тип проекта» я должен выбрать ..

Илон Маск рекомендует:  Тег abbr
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL