Это немного смутное представление, которое я испытывал в своей голове, и мне очень любопытно, есть ли элегантный метод решения. Возможно, это следует воспринимать как мысленный эксперимент.SVG через динамический XML + XSL
Представьте, что у вас есть XML-схема с соответствующим преобразованием XSL, которое отображает XML как SVG в браузере. XSL генерирует SVG с соответствующими обработчиками Javascript, которые, в конечном счете, реализуют подобную редактированию функциональность, так что свойства объектов или их местоположения на холсте SVG могут быть отредактированы пользователем. Например, элемент можно перетаскивать из одного места в другое.
Теперь это не особенно сложно - пример перетаскивания - это просто вопрос изменения координат (x, y) объекта SVG или операция изменения размера будет простым делом изменить его ширину или высота.
Но есть ли элегантный способ работы Javascript в DOM источника ? XML-документ вместо визуализированного SVG? Почему ты спрашиваешь? Ну, представьте, что у вас очень сложные XSL-преобразования, где модификация одного свойства приводит к сложным изменениям в SVG. Вы хотите сохранить простоту в своем Javascript-коде, но также и простой способ сохранить измененный XML обратно на сервер.
Некоторые возможности того, как это может работать:
- После модификации источника DOM, просто повторно запустить XSL преобразования и заменить оригинал. Нижняя сторона: грубая сила, потенциально дорогостоящая операция.
- Создайте соглашения об именах идентификаторов/классов в исходном и целевом XML/SVG, чтобы элементы могли быть связаны друг с другом и выполнять преобразование XSL только для подмножества новой DOM. Другими словами, измените временную DOM, примените к ней XSL, удалите измененные элементы из SVG и вставьте новый. Даунсайд: Невозможно применить XSL к временным DOM-адресам в браузере (?). Кроме того, возможно, немного запутанный или уродливый, чтобы поддерживать.
Я думаю, что возможно создать фреймворк, который обрабатывает второй сценарий, но задача будет сделать его легким и не сильно привязанным к реальной схеме XML. Любые идеи или другие возможности? Или, может быть, существует существующий метод этого, о котором я не знаю?
ОБНОВЛЕНИЕ: Чтобы уточнить, как я упоминал в комментарии ниже, это помогает отделить код рисования от кода редактирования. Для более конкретного примера того, как это полезно, представьте элемент, который определяет, как он нарисован, зависит от значения свойства соседнего элемента. Лучше сконденсировать эту логику непосредственно в коде draw, а не дублировать ее в коде редактирования.
Интересно услышать, что это жизнеспособно. Как вы сравниваете два выхода XSLT? –
Или, что вы подразумеваете под XSLT? что вы делаете внутри, или установленный стандарт, который я не смог найти? –
Мы различаем два выхода XSLT, используя другой XSLT. Мы можем это сделать, потому что мы изменили исходный XSLT (в результате получим XSLT), так что он будет выводить уникальные и постоянные идентификаторы для каждого выходного узла. Таким образом, все новые узлы будут иметь новые идентификаторы, а отсутствующие идентификаторы удаляются узлами. – Laurens