{"id":22356480,"url":"https://github.com/do-/2xsl","last_synced_at":"2026-01-06T15:04:51.230Z","repository":{"id":66721613,"uuid":"104566096","full_name":"do-/2xsl","owner":"do-","description":"Генератор XSLT-шаблонов","archived":false,"fork":false,"pushed_at":"2020-01-15T09:27:43.000Z","size":8,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-31T14:31:47.683Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"XSLT","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/do-.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-23T12:31:24.000Z","updated_at":"2020-01-15T09:27:45.000Z","dependencies_parsed_at":"2023-07-30T01:02:08.612Z","dependency_job_id":null,"html_url":"https://github.com/do-/2xsl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2F2xsl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2F2xsl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2F2xsl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2F2xsl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/do-","download_url":"https://codeload.github.com/do-/2xsl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245659054,"owners_count":20651526,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-04T14:10:49.650Z","updated_at":"2026-01-06T15:04:51.175Z","avatar_url":"https://github.com/do-.png","language":"XSLT","funding_links":[],"categories":[],"sub_categories":[],"readme":"2XSL: генератор XSLT\n====================\n\nИнструмент генерации XSLT-шаблонов из готовых XML-документов.\n\nСМЫСЛ ЗАТЕИ\n-----------\n\nПо ходу внедрения XML в качестве базового типа данных MS Office у разработчиков информационных систем появилась возможность генерировать по имеющимся данным офисные документы, используя шаблоны фомата [XSLT](https://www.w3.org/TR/xslt).\n\nЭто удобно, поскольку XSLT -- установившийся, широко известный, поддерживаемый, подробнейшим образом документированный стандарт, имеющий множество совместимых реализаций на разнобразных программных платформах.\n\nВ частности, современные Web-браузеры позволяют производить XSL-трансформации на клиенте и предлагать их результаты на сохранение в локальной файловой системе, что ощутимо снижает потребность в \"серверах печати\" для Intranet-систем.\n\nНАЧАЛО РАБОТЫ\n-------------\n\nКак правило, у разработчика на входе имеется образец документа и требования привязать в нём некоторые фрагменты текста к определённым полям БД.\n\nВ теории было бы достаточно сохранить файл как Office XML, обернуть его элементами xsl:stylesheet / xsl:template и далее вставлять по тексту xsl:value-of. Однако...\n\nПРОБЛЕМЫ\n--------\n\n...выясняется, что содержимое Office XML не годится к использованию в качестве XSL-шаблона. А именно:\n\n* узлы типа processing instruction (в частности, `\u003c?mso-application progid=\"Word.Document\"?\u003e`) игнорируютя XSLT-процессорами и не попадают в результат;\n* значения атрибутов, заключённые в фигурные скобки в тегах вроде `\u003cw:guid w:val=\"{DD78C2BA-25B9-4AE1-B133-50156EF35023}\"/\u003e`, считаются не текстом, а шаблонами для подстановки переменных.\n\nВ результате, помимо вышеупомянутого обёртывания верхнеуровневыми элементами, разработчику предстоит ещё зачистка внутреннего содержимого.\n\nРЕШЕНИЕ\n-------\n\nВпрочем, её можно выполнить при помощи того же самого механизма: XSLT.\n\nДостаточно обработать исходный XML-документ приложенным `2.xsl` -- и на выходе получится готовый корретный шаблон.\n\nДля обработки можно использовать любой XSLT-процессор командной строки.\n\nДля ясности к данному проекту приложен скрипт `xsl.pl`. Его использование требует наличия на машине Perl5 с модулями XML::LibXML и XML::LibXSLT.\n\nЕЩЁ РАЗ, ПО ШАГАМ\n-----------------\n\nШпаргалка для тех кто согласен использовать `xsl.pl`:\n\n### Шаг 0. Готовим директорию\n\nСоздаём пустую временную директорию.\n\nКопируем туда `2.xsl`, `xsl.pl` и заодно `data.xml`.\n\n### Шаг 1. Из Word в XML\n\nОткрываем файл .docx.\n\nНажимаем `F12`.\n\nВыбираем \"Тип файла\": \"XML-документ Word\".\n\nСохраняем в ранее заготовненную директорию.\n\nДопустим, файл называется `my_doc.xml`.\n\n### Шаг 2. Из XML в XSLT\n\nОткрываем командную строку во временной директории.\n\n`xsl.pl 2.xsl \u003c my_doc.xml \u003e my_doc.xsl`\n \nШаблон `my_doc.xsl` готов.\n\n### Шаг 3. Проверка\n\nПрименяем полученный `my_doc.xsl` к тестовым (пустым) данным\n\n`xsl.pl my_doc.xsl \u003c data.xml \u003e test.doc`\n\nТеперь можно открыть test.doc -- содержимое должно быть, как у исходного файла.\n\nЧТО ДАЛЬШЕ?\n-----------\n\nПереносить `my_doc.xsl` в программный код своей системы, искать там избранные фрагменты и заменять их на value-of, for-each и прочие элементы привязки к данным.\n\nПо желанию можно заменить `data.xml` на образец данных и повторять вышеописанный \"Шаг 3\" для отладки XSL вне системы.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-%2F2xsl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdo-%2F2xsl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-%2F2xsl/lists"}