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