将平面层次结构转换为嵌套在 XSLT 中,也可能存在间隙

问题描述 投票:0回答:1

总体概述

这个问题请遵循另一个问题才能完成。

目标是将

<h[0-6]>
的扁平层次结构转换为嵌套的
<ul>
-
<li>
结构,以制作目录。

目前,我的工作可以做到这一点,但是当文档从

<h2>
移动到
<h4>
且它们之间没有中间
<h3>
时,他不会处理层次结构中的所有间隙。

现状

document.xml

<?xml version="1.0" encoding="UTF-8"?>

<document>
<h1>Lorem <i>arepo</i> ipsum dolor</h1>
<h2>Lorem ipsum dolor</h2>
<p>
Sed ut <i>perspiciatis</i> unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
</p>

<h1>sit amet et consectetur</h1>
<h2>Quia adipit</h2>
<h3>aliquam quaerat</h3>
<h6>-HERE-</h6>
<p>
Sed ut <i>perspiciatis</i> unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
</p>
<h2>Erit et nunquam</h2>
<h3>corporis suscipit</h3>

</document>

maketoc.xslt

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:key name="child" match="h2|h3|h4|h5|h6" use="generate-id(preceding-sibling::*[name()=concat('h', substring-after(name(current()), 'h') - 1)][1])"/>


<xsl:template match="/document">
    <ul>
        <xsl:apply-templates select="h1"/>
    </ul>
</xsl:template>

<xsl:template match="h1|h2|h3|h4|h5|h6">
    <li>
        <span>
            <xsl:copy-of select="node()" />
        </span>
        <xsl:variable name="childElements" select="key('child', generate-id())"/>
        <xsl:if test="$childElements">
            <ul>
                <xsl:apply-templates select="$childElements"/>
            </ul>
        </xsl:if>
    </li>
</xsl:template>


</xsl:stylesheet>

电流输出

<ul>
   <li><span>Lorem <i>arepo</i> ipsum dolor</span><ul>
         <li><span>Lorem ipsum dolor</span></li>
      </ul>
   </li>
   <li><span>sit amet et consectetur</span><ul>
         <li><span>Quia adipit</span><ul>
               <li><span>aliquam quaerat</span></li>
            </ul>
         </li>
         <li><span>Erit et nunquam</span><ul>
               <li><span>corporis suscipit</span></li>
            </ul>
         </li>
      </ul>
   </li>
</ul>

在此示例中,元素根据其深度正确嵌套。除了节点

<h6>-HERE-</h6>
,因为他前面没有
<h5>
(但是它前面会有
<h5>
,在我们的示例中,这个
<h5>
本身应该前面有
<h4>
)。
document.xml
直接从
<h3>
移动到
<h6>

问题

所以,正如我所说,问题是层次差距没有被处理并且完全被忽略。但它们应该包含在最终目录中。

以我的谦虚观点,问题来自于这一行:

<xsl:key name="child" match="h2|h3|h4|h5|h6" use="generate-id(preceding-sibling::*[name()=concat('h', substring-after(name(current()), 'h') - 1)][1])"/>

特别是从这里

name(current()), 'h') - 1
使用减法运算符。因为它明确匹配严格较低的数字(因此在 HTML 中的
<h[0-6]>
层次结构中较高)。如果它是一个
<=
运算符,可以匹配紧邻的前一个标签,那么它的层次结构会更高。

相关步骤

  1. 使用 XSLT 1.0 的扁平结构,具有嵌套/分层的间隙。解决方案找到了,但是结构和我的不一样,所以我无法轻易适应。
  2. 将平面层次结构转换为 XSLT 深度的嵌套层次结构

问题

如何制作嵌套的

<ul>
-
<li>
标题节点层次结构并处理层次结构间隙?

xml xslt hierarchical html-heading
1个回答
0
投票

我认为解决方案可能很简单:

<xsl:key name="child" match="h2|h3|h4|h5|h6" use="generate-id(preceding-sibling::*[substring-after(name(), 'h') &lt; substring-after(name(current()), 'h')][1])" /> 
© www.soinside.com 2019 - 2024. All rights reserved.