我正在尝试使用递归函数按其轮廓级别嵌套平面元素,但是该功能会从某些元素中剥离文本。否则我将接近此工作,因为元素已按大纲级别正确嵌套。
这是源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>
我在做什么错?谢谢您的帮助!
答案 0 :(得分:1)
我猜<xsl:apply-templates select="*" mode="copy"/>
应该是<xsl:apply-templates mode="copy"/>
(或拼写为<xsl:apply-templates select="node()" mode="copy"/>
)。