Простой распаковка HTML файла через XSL - PullRequest
0 голосов
/ 22 апреля 2020

Я искал процедуры разблокировки через XSL, но ни одна из них на самом деле не работает для меня, хотя я считаю, что мой случай довольно прост. У меня есть коллекция HTML, всегда с одинаковой структурой, которую я хотел бы раскрыть с помощью преобразования XSL. По сути, речь идет о инкапсуляции в элементе <div> всех элементов, следующих за <p class='subtitle'> до следующего <p class='subtitle'>, и - в идеале! - по-прежнему применять преобразование к элементам индивидуально, но это необязательно (см. Ниже).

Исходный файл выглядит следующим образом:

[...some stuff on the page]
<p class='header'>Some text</p>
<p class='subtitle'>Subtitle 1</p>
<p class='content'>First paragraph of part 1, with some <span>Inside</span> and other 
nested elements, on multiple levels</p>
<ul>a list with <li> inside</ul>
<p class='content'>Second paragraph of part 1</p>
<img src='xyz.jpg'/>
<p class='content'>Third paragraph of part 1</p>
<p class='subtitle'>Subtitle 2</p>
<p class='content'>First paragraph of part 2</p>
<p class='content'>Second paragraph of part 2</p>
<p class='subtitle'>Subtitle 3 
[and so on…]

И я хотел бы превратить это в:

<div n='section1'>
    <head>Subtitle 1</head>
    <p>First paragraph of part 1, with some <span>Inside</span> and other and other 
     nested elements, on multiple levels</p>
    <ul>a list with <li> inside</ul>
    <p>Second paragraph of part 1</p>
    <picture source='xyz.jpg'/>
    <p>Third paragraph of part 1</p>
</div>
<div n="section2">
    <head>Subtitle 2</head>
    <p>First paragraph of part 2</p>
    <p>Second paragraph of part 2</p>
</div>
<div n="Section 3">
    <head>Subtitle 3</head>
    [and so on…]

Я не могу обойти эту проблему. Кроме того, если на первом шаге будет открыт только файл HTML (строго копирование элементов внутри div без преобразования), это уже было бы замечательно.

СПАСИБО заранее!

1 Ответ

1 голос
/ 22 апреля 2020

Это классическая c проблема позиционной группировки. Для начала:

<xsl:template match="body">
  <body>
    <xsl:for-each-group select="*" group-starting-with="p[@class='subtitle']">
      <xsl:choose>
        <xsl:when test="@class="subtitle">
          <div n="section{position()}">
            <head>{.}</head>
            <xsl:apply-templates select="tail(current-group())"/>
          </div>
        </xsl:when>
        <xsl:otherwise>
           <xsl:apply-templates select="current-group()"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each-group>
  </body>
</xsl:template>

Обратите внимание, что xsl:for-each-group требует XSLT 2.0 или более поздней версии. С XSLT 1.0 значительно сложнее.

...