我正在尝试重新制作列表列表,从 XML 转换为专有的基于 XML 的文件格式。
本质上输入是这样的
<ul>
<li>Item 1</li>
<li><ul><li>Sub item 1</li><li>Sub item 2</li></ul></li>
<li>Item 2</li>
<li><ul><li>Sub item 3</li><li>Sub item 4</li></ul></li>
</ul>
显然看起来像这样:
- 第 1 项
- 子项目 1
- 子项目 2
- 第 2 项
- 子项目 3
- 子项目 4
但我需要子项列表li
与其各自的标题位于同一个标签内。因此,如下所示:
- 第 1 项
- 子项目 1
- 子项目 2
- 第 2 项
- 子项目 3
- 子项目 4
当我测试上面的原始输入时,我似乎无法想出一个 XPATH,它会选择我的第一个子项ul
而不选择第二个子项ul
。
当通过转换运行时,这基本上会创建
<ul>
<li>Item 1
<ul><li>Sub item 1</li><li>Sub item 2</li></ul>
<ul><li>Sub item 3</li><li>Sub item 4</li></ul>
</li>
<li>Item 2
<ul><li>Sub item 3</li><li>Sub item 4</li></ul>
</li>
</ul>
让我走到这一步的 XPath 是
following-sibling::li[not(normalize-space(text()))]/*[1][self::ul or self::ol]
normalize-space 是隔离li
没有文本但里面只有ul
或的ol
元素。我尝试了上述的多种变体,设置索引 [1] 只会返回所有元素,而 [2] 则不返回任何元素。
我有点困惑,感谢任何意见或建议!
这似乎是一个分组问题,您可以在 XSLT 2 或更高版本(XSLT 的当前版本是 3.0)中使用以下方法解决
for-each-group group-starting-with
:示例小提琴在这里。
在 XSLT 1.0 中,您可以使用
key
: