xslt - 用于添加 ul 列表层次结构的递归 xslt 函数需要修复
问题描述
我正在尝试使用递归函数按大纲级别嵌套平面元素,但该函数会从某些元素中删除文本。否则,我将接近此工作,因为元素已按大纲级别正确嵌套。
这是源 XML。目标是将较高的轮廓元素嵌套在较低的内部。
<article>
<h3 class="icon component">
<img src="images/component.png" alt="component" class="bullet"/>
<span>Component: Forms</span>
</h3>
<p class="url details" data-outline="4">Sample: <a href="https://foo.com">foo.com</a></p>
<p class="details" data-outline="4">Start line: 540</p>
<p class="details" data-outline="4">End line: 700</p>
<p class="details" data-outline="4">Foo</p>
<li class="icon task" data-outline="4">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">Foo (Sev 3) (H48) </p>
</li>
<img src="images/image37.png" class="details" alt="Foo" data-outline="5"/>
<p class="details" data-outline="5">Foo foo</p>
<p class="details" data-outline="5">Foo foo</p>
<li class="icon task" data-outline="4">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">Foo <code>foo</code> (Sev 3) (G83)</p>
</li>
<img src="images/image38.png" class="details" alt="" data-outline="5"/>
<p class="caption details" data-outline="5">Screenshot: Foo foo</p>
<li class="icon task" data-outline="5">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">foo foo (Sev 2) (2.4.6, G131)</p>
</li>
<p class="details" data-outline="6">Foo foo</p>
</article>
这是功能:
<xsl:function name="fpp:group" as="node()*">
<xsl:param name="elements" as="element()*"/>
<xsl:param name="outline" as="xs:integer"/>
<xsl:for-each-group select="$elements" group-starting-with="*[@data-outline[.=$outline]]">
<xsl:choose>
<xsl:when test="self::*[@data-outline[.=$outline]]">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*" mode="copy"/>
<xsl:sequence select="fpp:group(current-group() except ., $outline + 1)"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()" mode="copy"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:function>
我是这样称呼它的:
<xsl:template match="article[li[matches(@class,'icon')]]" mode="step06">
<xsl:copy>
<xsl:variable name="hierarchy" select="fpp:group(*, 4)"/>
<xsl:apply-templates select="$hierarchy" mode="copy"/>
</xsl:copy>
</xsl:template>
这是当前输出,正确嵌套,但请注意移动的 p.details 元素缺少它们的 text() 字符串:
<article>
<h3 class="icon component">
<img src="images/component.png" alt="component" class="bullet"/>
<span>Component: Forms</span>
</h3>
<p class="url details" data-outline="4">
<a href="https:foo.com">foo.com</a>
</p>
<p class="details" data-outline="4"/>
<p class="details" data-outline="4"/>
<p class="details" data-outline="4"/>
<li class="icon task" data-outline="4">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">Foo (Sev 3) (H48) </p>
<img src="images/image37.png" class="details" alt="Foo" data-outline="5"/>
<p class="details" data-outline="5"/>
<p class="details" data-outline="5"/>
</li>
<li class="icon task" data-outline="4">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">Foo <code>foo</code> (Sev 3) (G83)</p>
<img src="images/image38.png" class="details" alt="" data-outline="5"/>
<p class="caption details" data-outline="5"/>
<li class="icon task" data-outline="5">
<img src="images/task.png" alt="task" class="bullet"/>
<p class="gist">Foo foo (Sev 2) (2.4.6, G131)</p>
<p class="details" data-outline="6"/>
</li>
</li>
</article>
我究竟做错了什么?谢谢你的帮助!
解决方案
我想<xsl:apply-templates select="*" mode="copy"/>
应该是<xsl:apply-templates mode="copy"/>
(或拼写出来<xsl:apply-templates select="node()" mode="copy"/>
)。
推荐阅读
- javascript - 从表格单元格复制到剪贴板
- node.js - 发布新的 NPM 包时未找到 E404
- c# - ASP.NET Core - 后台服务 - 如果应用程序意外关闭,异步任务会停止吗?
- redhat - RHSA-2020:1454 - 安全咨询
- android-studio - Android Studio 设置问题
- java - 为什么元素在 List 中添加不正确
在 Java 中? - mysql - 根据我的查询,它不应该返回值。但它显示了一些值
- python - NLP - Python - 条件频率分布失败
- ios - 带有 NotificationCenter 和 TabBarController 的 UICollectionView 可区分数据源
- javascript - 将 Firebase 数据库中的数据显示到 html 文档中