使用XSLT在旧XML中进行修改,然后将它们应用于新XML

时间:2014-12-03 20:00:06

标签: c# xml xslt

我认为我的问题很普遍,可以提出这个问题,但具体到足以让所有人都没有问过 - 或者我无法找到它。

任务如下:应用程序的配置存储在XML文档中。从那时起,应用程序不断发展,当前配置存储在不同的XML中。新XML的结构也不同,因此只需复制旧配置就会破坏应用程序。 我们的目标很简单:我们希望将配置更改从旧的XML文档移动到新的XML文档中。我们可以访问:

  • 未修改的旧XML
  • 修改旧XML
  • 未修改的新XML

根据上面的信息,我必须创建新的XML文档,其中重新应用旧xml中的修改。

我已经找到了算法,但我不想在这里重新发明轮子。高级算法如下:

  • 将未修改的XML中的每个节点与修改后的XML进行比较。
    • 如果未修改节点,则向前移动。
    • 如果删除某个节点,请将其xpath位置复制到removed-nodes集合。
    • 如果添加了某个节点,请将其xpath位置及其内容移入添加的节点集合中。
    • 如果修改了节点,请将修改后的原子内容/属性移动到modified-nodes集合
    • 如果节点不是原子节点,请将上述算法应用于每个后代节点。 (递归算法)
  • 打开新的XML,转到每个修改位置,然后
    • 删除已删除的节点
    • 添加添加的节点
    • 应用修改

收集的修改的xml布局如下所示:

<xml-diff>
    <added-node location="/xpath/to/the/node">
        <content-of-the-added-node with="attributes">
            <and-sub-elements-as-well/>
        </content-of-the-added-node>
    </added-node>
    <removed-node location="/xpath/to/the/node"/>
    <modified-node location="/xpath/to/the/node">
        <content-of-the-modified-node>modified-atomic-content</content-of-the-modified-node>
    </modified-node>
    <added-attribute location="/xpath/to/the/@attribute">value</added-attribute>
    <removed-attribute location="/xpath/to/the/@attribute" />
    <modified-attribute location="/xpath/to/the/@attribute">new-value</added-attribute>        
</xml-diff>

添加节点内容和已修改节点内容都是修改后的旧xml中的节点。

在旧xml中找到修改后,任务非常简单。我可以在新的xml中重新应用修改,其中xpath没有改变。我还有一个映射,它描述了旧的xpath值已更改为新的xpath值,从而正确应用配置更改。 (例如/ root / node1已移至/ root / collections / node1等)

我知道XSLT用于将一个XML转换为另一个XML。这里棘手的部分是检测什么是修改 - 转换是什么。遗憾地处理XML有点棘手,因为节点的顺序并不总是保持不变,但它仍然可能意味着同样的事情。

我的问题是:

  1. XSLT是解决此问题的正确途径,还是应该使用其他东西?
  2. 如果是XSLT,那么递归检测这些变化的正确转换算法是什么?
  3. 如果XSLT的答案不是什么?
  4. 你能给我一个简单的XSLT,我可以在哪里开始工作吗?
  5. 请注意,我在XSLT中是全新的。我熟悉XML,对XSD有一些基本的了解。

0 个答案:

没有答案