【发布时间】:2023-04-02 14:55:01
【问题描述】:
这是一个有点模糊的概念,我一直在脑海中闪过,我很好奇是否有一种优雅的解决方法。也许应该把它当作一个思想实验。
假设您有一个带有相应 XSL 转换的 XML 模式,它在浏览器中将 XML 呈现为 SVG。 XSL 使用适当的 Javascript 处理程序生成 SVG,最终实现类似编辑的功能,以便用户可以编辑对象的属性或其在 SVG 画布上的位置。例如,一个元素可以从一个位置拖到另一个位置。
现在,这并不是特别困难 - 拖放示例只是更改 SVG 对象的 (x,y) 坐标的问题,或者调整大小操作只是更改其宽度或高度的简单问题.
但是有没有一种优雅的方式让 Javascript 在 source XML 文档的 DOM 上而不是渲染的 SVG 上工作?你为什么问?好吧,假设您有非常复杂的 XSL 转换,其中一个属性的修改会导致 SVG 的复杂更改。您希望保持 Javascript 代码的简单性,同时也是一种将修改后的 XML 持久保存回服务器的简单方法。
这可能如何发挥作用的一些可能性:
- 修改源 DOM 后,只需重新运行 XSL 转换并替换原来的即可。 缺点:蛮力,潜在的昂贵操作。
- 在源 XML/SVG 和目标 XML/SVG 中创建 id/class 命名约定,以便元素可以相互关联,并仅对新 DOM 的一个子集进行 XSL 转换。换句话说,修改临时 DOM,对其应用 XSL,从 SVG 中删除更改的元素,然后插入新元素。 缺点:可能无法将 XSL 应用于临时的浏览器内 DOM(?)。此外,维护起来可能有点复杂或难看。
我认为有可能提出一个处理第二种情况的框架,但挑战在于使其轻量级并且不与实际的 XML 模式密切相关。有什么想法或其他可能性吗?或者是否有一种我不知道的现有方法?
更新:为了澄清,正如我在下面的评论中提到的,这有助于将绘制代码与编辑代码分开。有关这如何有用的更具体示例,请想象一个元素,该元素根据相邻元素的属性值确定它的绘制方式。最好直接在绘制代码中压缩该逻辑,而不是在编辑代码中复制它。
【问题讨论】:
标签: javascript xml xslt dynamic svg