使用XSLT 1.0构建层次结构的目录(深度不同)

时间:2018-08-31 15:45:27

标签: xslt xslt-1.0

我有各种书籍作为xml文件,其中包括嵌套的div元素,这些元素包含各个级别的记录标题和记录ID信息-部分/章节/文章记录/诗歌等。

我需要输出一个目录结构,该目录结构由对原始结构中每个div的子div标题信息进行分组的部分组成。但是,如果这些子div元素中的任何一个具有自己的(大)子div元素,则它们需要在输出中填充新的section元素。


并发症是:
1)每个项目(即div / title)都需要以原始读取顺序显示(它们在xml中显示的顺序与div级别无关)
2)项目只能出现一次(即,标头中使用的div信息也不能作为另一节的子项包含在内)
3)每本书可以具有不同深度的嵌套div元素(最多8个级别)

如果将父标题用作上一个section元素的标题,则不需要输出中的header元素。部分可能没有孩子。

输入xml的简化版本如下所示:

<div0>
  <div1>
    <title>Intro</title><id>A1</id>
  </div1>
  <div1>
    <title>Volume</title><id>A2</id>
    <div2>
      <title>Preface</title><id>A3</id>
    </div2>
    <div2>
      <title>Dedication</title><id>A4</id>
    </div2>
    <div2>
      <title>Part 1</title><id>A5</id>
      <div3>
          <title>Chapter 1</title><id>A6</id>
      </div3>
      <div3>
          <title>Chapter 2</title><id>A7</id>
      </div3>
      <div3>
          <title>Chapter 3</title><id>A8</id>
      </div3>
      <div3>
          <title>Chapter 4</title><id>A9</id>
          <div4>
            <title>Poem 1</title><id>A10</id>
          </div4>
          <div4>
            <title>Poem 2</title><id>A11</id>
          </div4>
      </div3>
      <div3>
          <title>Chapter 5</title><id>A12</id>
      </div3>
      <div3>
          <title>Chapter 6</title><id>A13</id>
      </div3>       
    </div2>
    <div2>
       <title>Part 2</title><id>A14</id>
      <div3>
          <title>Chapter 7</title><id>A15</id>
      </div3>
      <div3>
          <title>Chapter 8</title><id>A16</id>
          <div4>
            <title>Illustration 1</title><id>A17</id>
          </div4>
          <div4>
            <title>Illustration 2</title><id>A18</id>
          </div4>
          <div4>
            <title>Illustration 3</title><id>A19</id>
          </div4>
      </div3>
      <div3>
          <title>Chapter 9</title><id>A20</id>
      </div3>
      <div3>
          <title>Chapter 10</title><id>A21</id>
      </div3>
    </div2>
    <div2>
       <title>Back Matter</title><id>A22</id>
    </div2>
  </div1>
</div0>

我希望得到的输出是:

<toc>
<section id="1">
  <level>1</level>
  <order>1</order>
  <header>Intro</header>
  <link>A1</link>
</section>

<section id="2">
  <level>1</level>
  <order>2</order>
  <header>Volume</header>
  <link>A2</link>
  <child>
    <name>Preface</name>
    <link>A3</link>
  </child>
  <child>
      <name>Dedication</name>
      <link>A4</link>
  </child>
</section>

<section id="3">
  <level>2</level>
  <parentSectionID>2</parentSectionID>
  <order>3</order>
  <header>Part 1</header>
  <link>A5</link>
  <child>
    <name>Chapter 1</name>
    <link>A6</link>
  </child>
  <child>
      <name>Chapter 2</name>
      <link>A7</link>
  </child>
  <child>
      <name>Chapter 3</name>
      <link>A8</link>
  </child>  
</section>

<section id="4">
  <level>3</level>
  <parentSectionID>3</parentSectionID>
  <order>4</order>
  <header>Chapter 4</header>
  <link>A9</link>
  <child>
    <name>Poem 1</name>
    <link>A10</link>
  </child>
  <child>
      <name>Poem 2</name>
      <link>A11</link>
  </child>
</section>

<section id="5">
  <level>2</level>
  <parentSectionID>3</parentSectionID>
  <order>5</order>
  <child>
    <name>Chapter 5</name>
    <link>A12</link>
  </child>
  <child>
      <name>Chapter 6</name>
      <link>A13</link>
  </child>
</section>

<section id="6">
  <level>2</level>
  <parentSectionID>2</parentSectionID>
  <order>6</order>
  <header>Part 2</header>
  <link>A14</link>
  <child>
    <name>Chapter 7</name>
    <link>A15</link>
  </child>
</section>

<section id="7">
  <level>3</level>
  <parentSectionID>6</parentSectionID>
  <order>7</order>
  <header>Chapter 8</header>
  <link>A16</link>
  <child>
    <name>Illustration 1</name>
    <link>A17</link>
  </child>
  <child>
    <name>Illustration 2</name>
    <link>A18</link>
  </child>
  <child>
    <name>Illustration 3</name>
    <link>A19</link>
  </child>
</section>

<section id="8">
  <level>2</level>
  <parentSectionID>2</parentSectionID>
  <order>8</order>
  <child>
    <name>Chapter 9</name>
    <link>A20</link>
  </child>
  <child>
      <name>Chapter 10</name>
      <link>A21</link>
  </child>
</section>

<section id="9">
  <level>2</level>
  <parentSectionID>2</parentSectionID>
  <order>9</order>
  <header>Back Matter</header>
  <link>A22</link>
</section>
</toc>

我可以确定如何找到所有div级别(使用starts-with(local-name(),'div')并检查每个div子级和div孙子级,但是我无法确定如何分组将它们分成多个部分,当发现一个子div具有自己的子div时,该部分会分成新的部分,然后在没有孙子div的情况下返回到下一个子div的上一级。要么我在for-each循环中丢失了读取顺序否则我最终会在输出中出现重复。

如果有人可以提供将标题分组到各个部分的解决方案,假设我能理解方法,那么我自己就能算出如何填充各个部分的ID,级别信息等。

0 个答案:

没有答案