代码之家  ›  专栏  ›  技术社区  ›  Daniel Naab

通过动态XML+XSL实现SVG

  •  1
  • Daniel Naab  · 技术社区  · 17 年前

    假设您有一个带有相应XSL转换的XML模式,它在浏览器中将XML呈现为SVG。XSL使用适当的Javascript处理程序生成SVG,最终实现类似编辑的功能,以便用户可以编辑SVG画布上对象的属性或它们的位置。例如,可以将元素从一个位置拖到另一个位置。

    但是,有没有一种优雅的方法可以让Javascript在 来源

    这可能如何发挥作用的一些可能性:

    1. 缺点
    2. 在源XML/SVG和目标XML/SVG中创建id/类命名约定,以便元素可以相互关联,并且只在新DOM的子集上执行XSL转换。换句话说,修改临时DOM,对其应用XSL,从SVG中删除更改的元素,然后插入新的元素。 缺点

    我认为有可能提出一个处理第二种场景的框架,但挑战在于使其轻量级,并且不与实际的XML模式紧密关联。有什么想法或其他可能性吗?或者有没有一种我不知道的方法?

    :为了澄清,正如我在下面的评论中提到的,这有助于将绘制代码与编辑代码分离。有关此功能的更具体示例,请想象一个元素,该元素根据相邻元素的属性值确定如何绘制它。最好在绘图代码中直接压缩该逻辑,而不是在编辑代码中复制它。

    2 回复  |  直到 17 年前
        1
  •  2
  •   Daniel Naab    16 年前

    我们已经在浏览器中的XML编辑器Xopus中完成了这项工作。你可以看到一个例子 here . 我们加载XML源文档、XML模式和输出HTML+SVG的XSLT。在内部,我们将XSLT重写为“XSLT”,这将允许我们跟踪输出HTML+SVG,返回到原始XML,该XML是XSL中的上下文,以输出该HTML或SVG节点。这就是您所指的框架。

    我们使用另一个XSLT区分两个XSLT输出。我们可以这样做,因为我们已经修改了原始XSLT(结果是XSLT),以便为每个输出节点输出唯一和持久的ID。因此,所有新节点都将具有新ID,缺少的ID将被删除。

    “XSLT”是您提供的原始XSLT的重写版本。它仍然是XSLT,但我们添加了一些东西,以便它为所有输出节点输出ID(我们使用另一个XSLT)。除此之外,它在功能上等同于原始XSLT。

        2
  •  0
  •   Aaron Digulla    17 年前

    也许可以使用can-AJAX:不要在本地编辑文档,而是将原始XML的编辑命令发送到服务器,服务器再次进行转换,然后将新的SVG发送回来。

    这里的主要问题是在当前页面上更新SVG元素时会发生什么。drag'n'drop是否仍然感觉平滑?如果没有,那么您可能不得不求助于这两种方法的混合:使用JavaScript拖动SVG节点,当用户删除节点时,向服务器发送新SVG的更新。

    您将希望避免尝试同步XML和本地SVG中的更新(这意味着在JavaScript中复制XSLT的一部分->呆在一个世界里,不要混在一起)。