разбиение XML-файла на несколько файлов с использованием h1 и id - PullRequest
0 голосов
/ 17 февраля 2011

Я нуб XSLT.Я превращаю XML-файл в HTML.Полученные файлы будут иметь форму файлов .inc, которые будут использоваться в качестве включений на стороне сервера.Сейчас мне нужно разделить файл XML на узле h1 и записать его в несколько файлов .inc (содержащих все между каждым узлом h1), используя идентификатор h1 в качестве имени файла.Идентификатор h1 принимает форму «scriptLabel».Прямо сейчас, документ разделяется нормально - НО просто пишет сам h1 и игнорирует содержимое после.Что я делаю не так?

Вот пример XML:

`<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE document SYSTEM "RRfront150610.dtd">
<document>
  <section charstyle="No Style" pagenum="56" parastyle="Gov-Head-A"
  scriptlabel="Gov-chairman-intro">
    <h1 charstyle="No Style" pagenum="56" parastyle="Gov-Head-A"
    scriptlabel="Gov-chairman-intro">chairman&#8217;s
    introduction</h1>
    <p charstyle="No Style" pagenum="56"
    parastyle="Gov&#8211;Head-B-CI" scriptlabel="">
      <strong charstyle="No Style" pagenum="56"
      parastyle="Gov&#8211;Head-B-CI" scriptlabel="">Lorem ipsum
      dolor sit amet, consectetur adipiscing elit. Morbi et leo
      purus. Maecenas at metus massa. Donec rutrum tortor ac enim
      tincidunt ut posuere purus aliquam.</strong>
    </p>
    <p charstyle="No Style" pagenum="56" parastyle="Gov-Body-CI"
    scriptlabel="">Lorem ipsum dolor sit amet, consectetur
    adipiscing elit. Morbi et leo purus. Maecenas at metus massa.
    Donec rutrum tortor ac enim tincidunt ut posuere purus
    aliquam.</p>
  </section>
</document>`

Вот XSLT для выполнения разделения:

`<xsl:template match="/">
  <xsl:apply-templates />
</xsl:template>
<xsl:template match="document">
  <xsl:apply-templates />
</xsl:template>
<xsl:template match="h1">
  <xsl:variable name="filename"
  select="concat(@scriptlabel,'.inc')" />
  <xsl:value-of select="$filename" />
  <xsl:result-document href="{$filename}">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:result-document>
</xsl:template>`

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

В кратком ответе эта таблица стилей:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="section">
        <xsl:for-each-group select="node()" group-starting-with="h1">
            <xsl:result-document href="{@scriptlabel}.inc">
                <xsl:copy-of select="current-group()"/>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

Сериализуйте это Gov-chairman-intro.inc:

<h1 charstyle="No Style" 
    pagenum="56" 
    parastyle="Gov-Head-A" 
    scriptlabel="Gov-chairman-intro"
 >chairman’s     introduction</h1>
<p charstyle="No Style" 
   pagenum="56" 
   parastyle="Gov–Head-B-CI" 
   scriptlabel="">
    <strong charstyle="No Style" 
                 pagenum="56" 
                 parastyle="Gov–Head-B-CI" 
                 scriptlabel=""
          >Lorem ipsum       dolor sit amet, consectetur adipiscing elit. Morbi et leo       purus. Maecenas at metus massa. Donec rutrum tortor ac enim       tincidunt ut posuere purus aliquam.</strong>
</p>
<p charstyle="No Style" 
   pagenum="56" 
   parastyle="Gov-Body-CI" 
   scriptlabel=""
 >Lorem ipsum dolor sit amet, consectetur     adipiscing elit. Morbi et leo purus. Maecenas at metus massa.     Donec rutrum tortor ac enim tincidunt ut posuere purus     aliquam.</p>

Примечание: Группировка section детей по началу h1. Копирование всей текущей группы.

Обновление : Работа с section без h1 дочернего элемента, а также без запуска h1 группы.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="section">
        <xsl:for-each-group select="*" group-adjacent="boolean(self::h1)">
            <xsl:if test="not(current-grouping-key())">
                <xsl:variable name="vMark" select="preceding-sibling::h1[1]"/>
                <xsl:result-document
                     href="{((..|$vMark)/@scriptlabel)[last()]}.inc">
                    <xsl:copy-of select="current-group()|$vMark"/>
                </xsl:result-document>
            </xsl:if>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<document>
    <section charstyle="No Style" pagenum="56" parastyle="Gov-Head-A"
             scriptlabel="Gov-chairman-intro">
        <h1 charstyle="No Style" pagenum="56" parastyle="Gov-Head-A"
             scriptlabel="Gov-chairman-intro">chairman&#8217;s
             introduction</h1>
        <p charstyle="No Style" pagenum="56"
           parastyle="Gov&#8211;Head-B-CI" scriptlabel="">
            <strong charstyle="No Style" pagenum="56"
                    parastyle="Gov&#8211;Head-B-CI" scriptlabel=""
             >Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Morbi et leo purus. Maecenas at metus massa. Donec
              rutrum tortor ac enim tincidunt ut posuere purus
              aliquam.</strong>
        </p>
        <p charstyle="No Style" pagenum="56" parastyle="Gov-Body-CI"
           scriptlabel="">Lorem ipsum dolor sit amet, consectetur
           adipiscing elit. Morbi et leo purus. Maecenas at metus
           massa. Donec rutrum tortor ac enim tincidunt ut posuere
           purus aliquam.</p>
    </section>
    <section charstyle="No Style" pagenum="56" parastyle="Gov-Head-A"
             scriptlabel="Test-no-H1">
        <p charstyle="No Style" pagenum="56"
           parastyle="Gov&#8211;Head-B-CI" scriptlabel="">
            <strong charstyle="No Style" pagenum="56"
                    parastyle="Gov&#8211;Head-B-CI" scriptlabel=""
             >Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Morbi et leo purus. Maecenas at metus massa. Donec
              rutrum tortor ac enim tincidunt ut posuere purus
              aliquam.</strong>
        </p>
        <p charstyle="No Style" pagenum="56" parastyle="Gov-Body-CI"
           scriptlabel="">Lorem ipsum dolor sit amet, consectetur
           adipiscing elit. Morbi et leo purus. Maecenas at metus
           massa. Donec rutrum tortor ac enim tincidunt ut posuere
           purus aliquam.</p>
    </section>
</document>

Правильно сериализовать Gov-chairman-intro.inc

<h1 charstyle="No Style" pagenum="56" parastyle="Gov-Head-A" scriptlabel="Gov-chairman-intro">chairman’s
             introduction</h1><p charstyle="No Style" pagenum="56" parastyle="Gov–Head-B-CI" scriptlabel=""><strong charstyle="No Style" pagenum="56" parastyle="Gov–Head-B-CI" scriptlabel="">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Morbi et leo purus. Maecenas at metus massa. Donec
              rutrum tortor ac enim tincidunt ut posuere purus
              aliquam.</strong></p><p charstyle="No Style" pagenum="56" parastyle="Gov-Body-CI" scriptlabel="">Lorem ipsum dolor sit amet, consectetur
           adipiscing elit. Morbi et leo purus. Maecenas at metus
           massa. Donec rutrum tortor ac enim tincidunt ut posuere
           purus aliquam.</p>

А Test-no-H1.inc

<p charstyle="No Style" pagenum="56" parastyle="Gov–Head-B-CI" scriptlabel=""><strong charstyle="No Style" pagenum="56" parastyle="Gov–Head-B-CI" scriptlabel="">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Morbi et leo purus. Maecenas at metus massa. Donec
              rutrum tortor ac enim tincidunt ut posuere purus
              aliquam.</strong></p><p charstyle="No Style" pagenum="56" parastyle="Gov-Body-CI" scriptlabel="">Lorem ipsum dolor sit amet, consectetur
           adipiscing elit. Morbi et leo purus. Maecenas at metus
           massa. Donec rutrum tortor ac enim tincidunt ut posuere
           purus aliquam.</p>

Примечание : группа примыкает к "Я знак?", Копировать группу и предшествующий знак.

0 голосов
/ 17 февраля 2011

Ваше совпадение на "h1", поэтому в результирующий документ добавляется только h1.

Можете ли вы реорганизовать ваши данные так, чтобы вы имели ...

<section>
  <h1>Content 1</h1>
  <p>...</p>
  <p>...</p>
</section>
<section>
  <h1>Content 2</h1>
  <p>...</p>
  <p>...</p>
</section>

Вы можете переименовать тег раздела так, как вам хочется, чтобы не нарушать существующий код.Тогда ваш xslt будет выглядеть так

<xsl:template match="section">
  <xsl:variable name="filename"
  select="concat(@scriptlabel,'.inc')" />
  <xsl:value-of select="$filename" />
  <xsl:result-document href="{$filename}">
      <xsl:copy-of select=" ./* " />
  </xsl:result-document>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...