Создать таблицу в XSL из XML - PullRequest
0 голосов
/ 01 мая 2018

Я хочу создать XSL-файл для создания PDF-файлов.

         <values>
            <item>
              <html>
                <p xmlns="http://www.w3.org/1999/xhtml">Step</p>
              </html>
            </item>
            <item>
              <html>
                <p xmlns="http://www.w3.org/1999/xhtml">Description</p>
              </html>
            </item>
            <item>
              <html>
                <p xmlns="http://www.w3.org/1999/xhtml">Result</p>
              </html>
            </item>
          </values>

Нет, я хочу представить этот PDF-файл в виде таблицы, но я не понимаю, как реализовать его в моем существующем файле.

Результат должен выглядеть следующим образом

Я действительно новичок в XSL, и я надеюсь, что некоторые могут помочь решить эту проблему.

Много приветствий

1 Ответ

0 голосов
/ 01 мая 2018

Минимальный пример для преобразования этого фрагмента XML в таблицу XSL-FO:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="fo xhtml"
    version="3.0">

<xsl:output indent="yes"/>

<xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="sample">
                <fo:region-body/>
            </fo:simple-page-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="sample">
            <fo:flow flow-name="xsl-region-body">
                <fo:block>
                    <xsl:apply-templates/>
                </fo:block>
            </fo:flow>
        </fo:page-sequence>
    </fo:root>

</xsl:template>

<xsl:template match="values">
    <fo:table>
        <fo:table-column column-width="*"/>
        <fo:table-column column-width="*"/>
        <fo:table-column column-width="*"/>
        <fo:table-header>
          <fo:table-row>
            <fo:table-cell>
              <fo:block font-weight="bold">Step</fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block font-weight="bold">Step description</fo:block>
            </fo:table-cell>
            <fo:table-cell>
              <fo:block font-weight="bold">Expected result</fo:block>
            </fo:table-cell>
          </fo:table-row>
        </fo:table-header>

        <fo:table-body>
          <fo:table-row>
              <xsl:apply-templates/>
          </fo:table-row>
        </fo:table-body>
    </fo:table>
</xsl:template>

<xsl:template match="item">
   <fo:table-cell>
      <fo:block>
          <xsl:value-of select="html/xhtml:p"/>
      </fo:block>
    </fo:table-cell>
</xsl:template>

</xsl:stylesheet>

В https://xsltfiddle.liberty -development.net / gWmuiJ4 , который преобразует ваш входной фрагмент в FO

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="sample">
         <fo:region-body/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="sample">
      <fo:flow flow-name="xsl-region-body">
         <fo:block>
            <fo:table>
               <fo:table-column column-width="*"/>
               <fo:table-column column-width="*"/>
               <fo:table-column column-width="*"/>
               <fo:table-header>
                  <fo:table-row>
                     <fo:table-cell>
                        <fo:block font-weight="bold">Step</fo:block>
                     </fo:table-cell>
                     <fo:table-cell>
                        <fo:block font-weight="bold">Step description</fo:block>
                     </fo:table-cell>
                     <fo:table-cell>
                        <fo:block font-weight="bold">Expected result</fo:block>
                     </fo:table-cell>
                  </fo:table-row>
               </fo:table-header>
               <fo:table-body>
                  <fo:table-row>
                     <fo:table-cell>
                        <fo:block> i am a step</fo:block>
                     </fo:table-cell>
                     <fo:table-cell>
                        <fo:block>i am a desc</fo:block>
                     </fo:table-cell>
                     <fo:table-cell>
                        <fo:block>i am a res</fo:block>
                     </fo:table-cell>
                  </fo:table-row>
               </fo:table-body>
            </fo:table>
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

, который отображается как таблица, вам нужно будет добавить атрибуты, чтобы иметь границы.

Чтобы вставить этот подход в существующую таблицу стилей, вы должны принять во внимание входное пространство имен и добавить префиксные выражения или выбрать выражения, как вы это делали в других частях таблицы стилей, а затем вам нужно только вставить последние два шаблоны в таблицу стилей и убедитесь, что вы используете <xsl:apply-templates/> или <xsl:apply-templates select="values"/> (опять же, с любым необходимым префиксом пространства имен) в том месте, где вы хотите вставить таблицу в контексте родителя элемента values.

...