Arhn - архитектура программирования

Обернуть вывод шаблона в элементы

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

Мой текущий шаблон make направляет вызовы шаблонов outputText, outputTable.

Теперь мне нужно обернуть вывод каждого шаблона в пару div. Это происходит много (много!) раз в моем XSL, поэтому я ищу решение, которое не требует добавления шаблона оболочки до и после каждого вызова.

Я попытался добавить шаблон xsl:call-template в шаблон xsl:call-template. Я также пытался передать имя шаблона в качестве параметра (пример ниже).

Есть ли способ добавить код до и после каждого вызова шаблона, не дублируя везде код оболочки?

Образец XSL

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match='/' >
<html>
    <body>
    <div class='content'>
        <div class='row'>
            <div class='col-sm-6'>
                <!-- 
                    Original Call straight to the template 
                    <xsl:call-template name='outputText'>
                -->
                <xsl:call-template name='wrapper'>
                    <xsl:with-param name='outputText'/>
                </xsl:call-template>
            </div>

            <div class='col-sm-6'>
                <!-- 
                    Original Call straight to the template 
                    <xsl:call-template name='outputTable'>
                -->
                <xsl:call-template name='wrapper'>
                    <xsl:with-param name='outputTable'/>
                </xsl:call-template>
            </div>
        </div>
    </div>
    </body>
</html>
</xsl:template>

<xsl:template name='wrapper'>
    <xsl:param name='template'/>
    <div class='top-wrapper'>
        <div class='wrappercontent'>
            <h1>Content Wrapper</h1>
        </div>
        <div class='inner-wrapper'>
            <xsl:call-template name='{$template}'/>
        </div>
    </div>
</xsl:template>

<xsl:template name='outputText'>
    <h1>Test Header</h1>
    <p>Test content</p>
</xsl:template>

<xsl:template name='outputTable'>
    <h1>Test Table</h1>
    <table>
        <tr>
            <th>Name</th>
            <th>Age</th>
        </tr>
        <xsl:for-each select='/xml/character'>
            <tr>
                <td><xsl:value-of select='@name'/></td>
                <td><xsl:value-of select='@age'/></td>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>
</xsl:stylesheet>

Пример XML

<xml>
    <character name='Zaphod Beeblerox' age='100'/>
    <character name='Harry Potter' age='13'/>
</xml>

Желаемый результат будет выглядеть так

<html>
    <body>
        <div class="content">
            <div class="row">
                <div class="col-sm-6">
                    <div class="top-wrapper">
                        <div class="wrappercontent">
                            <h1>Content Wrapper</h1>
                        </div>
                        <div class="inner-wrapper">
                            <h1>Test Header</h1>
                            <p>Test content</p>
                        </div>
                    </div>
                </div>
                <div class="col-sm-6">
                    <div class="top-wrapper">
                        <div class="wrappercontent">
                            <h1>Content Wrapper</h1>
                        </div>
                        <div class="inner-wrapper">
                            <h1>Test Table</h1>
                            <table>
                                <tr>
                                    <th>Name</th>
                                    <th>Age</th>
                                </tr>
                                <tr>
                                    <td>Zaphod Beeblerox</td>
                                    <td>100</td>
                                </tr>
                                <tr>
                                    <td>Harry Potter</td>
                                    <td>13</td>
                                </tr>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>
22.09.2015

  • Пожалуйста, покажите ожидаемый результат для примера ввода. 22.09.2015

Ответы:


1

Вы можете использовать микроконвейерную обработку, например...

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
<xsl:output method="html" indent="yes" encoding="utf-8" version="5" doctype-system="" />
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <hmtl>
    <head>
      <title>Hitchhiker's guide</title>
    </head>
    <body>
      <xsl:apply-templates select="xml" />
    </body>
  </hmtl>
</xsl:template>

<xsl:template match="xml">
  <div class='content'>
    <div class='row'>
      <div class='col-sm-6'>
        <xsl:variable name="content-to-be-wrapped">
          <xsl:call-template name="outputText" />
        </xsl:variable>
        <xsl:call-template name="Wrap">
          <xsl:with-param name="content" select="$content-to-be-wrapped" />
        </xsl:call-template>
      </div>

      <div class='col-sm-6'>
        <xsl:variable name="content-to-be-wrapped">
          <xsl:call-template name="outputTable" />
        </xsl:variable>
        <xsl:call-template name="Wrap">
          <xsl:with-param name="content" select="$content-to-be-wrapped" />
        </xsl:call-template>
      </div>
    </div>
  </div>
</xsl:template>

<xsl:template name="Wrap">
  <xsl:param name="content" />
  <div class='top-wrapper'>
    <div class='wrappercontent'><h1>Content Wrapper</h1></div>
    <div class='inner-wrapper'>
      <xsl:copy-of select="$content" />
    </div>
  </div>  
</xsl:template>

<xsl:template name="outputText">
  <h1>Test Header</h1>
  <p>Test content</p>
</xsl:template>

<xsl:template name="outputTable">
  <h1>Test Table</h1>
  <table>
    <tr><th>Name</th><th>Age</th></tr>
    <xsl:apply-templates select="character" />
  </table>
</xsl:template>  

<xsl:template match="character">
  <tr>
    <td><xsl:value-of select='@name'/></td>
    <td><xsl:value-of select='@age'/></td>
  </tr>
</xsl:template>  

</xsl:stylesheet>

...или прямо таким образом...

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
<xsl:output method="html" indent="yes" encoding="utf-8" version="5" doctype-system="" />
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <hmtl>
    <head>
      <title>Hitchhiker's guide</title>
    </head>
    <body>
      <xsl:apply-templates select="xml" />
    </body>
  </hmtl>
</xsl:template>

<xsl:template match="xml">
  <div class='content'>
    <div class='row'>
      <div class='col-sm-6'>
        <xsl:call-template name="Wrap">
          <xsl:with-param name="content">
            <xsl:call-template name="outputText" />
          </xsl:with-param>
        </xsl:call-template>
      </div>

      <div class='col-sm-6'>
        <xsl:call-template name="Wrap">
          <xsl:with-param name="content">
            <xsl:call-template name="outputTable" />
          </xsl:with-param>
        </xsl:call-template>
      </div>
    </div>
  </div>
</xsl:template>

<xsl:template name="Wrap">
  <xsl:param name="content" />
  <div class='top-wrapper'>
    <div class='wrappercontent'><h1>Content Wrapper</h1></div>
    <div class='inner-wrapper'>
      <xsl:copy-of select="$content" />
    </div>
  </div>  
</xsl:template>

<xsl:template name="outputText">
  <h1>Test Header</h1>
  <p>Test content</p>
</xsl:template>

<xsl:template name="outputTable">
  <h1>Test Table</h1>
  <table>
    <tr><th>Name</th><th>Age</th></tr>
    <xsl:apply-templates select="character" />
  </table>
</xsl:template>  

<xsl:template match="character">
  <tr>
    <td><xsl:value-of select='@name'/></td>
    <td><xsl:value-of select='@age'/></td>
  </tr>
</xsl:template>  

</xsl:stylesheet>

Приведенные выше таблицы стилей XSLT 1.0 при применении к входным...

<xml>
    <character name='Zaphod Beeblerox' age='100'/>
    <character name='Harry Potter' age='13'/>
</xml>

... выдать выходную html-страницу ...

<!DOCTYPE html SYSTEM "">
<hmtl>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Hitchhiker's guide</title>
  </head>
  <body>
    <div class="content">
      <div class="row">
        <div class="col-sm-6">
          <div class="top-wrapper">
            <div class="wrappercontent">
              <h1>Content Wrapper</h1>
            </div>
            <div class="inner-wrapper">
              <h1>Test Header</h1>
              <p>Test content</p>
            </div>
          </div>
        </div>
        <div class="col-sm-6">
          <div class="top-wrapper">
            <div class="wrappercontent">
              <h1>Content Wrapper</h1>
            </div>
            <div class="inner-wrapper">
              <h1>Test Table</h1>
              <table>
                <tr>
                  <th>Name</th>
                  <th>Age</th>
                </tr>
                <tr>
                  <td>Zaphod Beeblerox</td>
                  <td>100</td>
                </tr>
                <tr>
                  <td>Harry Potter</td>
                  <td>13</td>
                </tr>
              </table>
            </div>
          </div>
        </div>
      </div>
    </div>
  </body>
</hmtl>
22.09.2015
  • Именно то, что я искал, СПАСИБО Шон 22.09.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..