作为 XSLT 的新手,我希望这是一个简单的问题。我有一些平面 XML 文件,它们可能非常大(例如 7MB),我需要使它们“更具层次性”。例如,平面 XML 可能如下所示:
<D0011>
<b/>
<c/>
<d/>
<e/>
<b/>
....
....
</D0011>
它最终应该看起来像这样:
<D0011>
<b>
<c/>
<d/>
<e/>
</b>
<b>
....
....
</D0011>
我有一个可以工作的 XSLT,它基本上获取所有 b 元素的节点集,然后使用“following-sibling”轴获取当前 b 节点之后的节点的节点集(即,following-sibling::* [位置()=$nodePos])。然后使用递归将兄弟姐妹添加到结果树中,直到找到另一个 b 元素(我当然已经对其进行了参数化,以使其更通用)。
我还有一个解决方案,它只发送下一个 b 节点的 XML 中的位置,并通过 *[position() = $nodePos] 选择一个接一个地选择该节点之后的节点(使用递归)。
问题是执行转换的时间随着 XML 文件的大小增加而无法接受。使用 XML Spy 对其进行调查,似乎是 'following-sibling' 和 'position()=' 在这两种方法中花费了时间。
我真正需要的是一种在上述选择中限制节点数量的方法,因此执行的比较更少:每次测试位置时,都会测试节点集中的每个节点,看它的位置是否正确。有没有办法做到这一点 ?还有其他建议吗?
谢谢,
麦克风