Spec-Zone.ru › Web APIs

Генерация HTML

Одно из распространенных применений XSLT в браузере — преобразование XML в HTML на стороне клиента. В этом примере будет преобразовано входной документ (example2.xml), содержащий информацию об статье, в HTML-документ.

Элемент <body> статьи теперь содержит HTML-элементы (тег <b> и тег <u>). XML-документ содержит как HTML-элементы, так и XML-элементы, но нужен только один namespace, а именно для XML-элементов. Поскольку нет HTML-namespace, а использование XHTML-namespace заставит XSL создавать XML-документ, который не будет вести себя как HTML-документ, xsl:output в XSL-стиле обеспечит, что результирующий документ будет обрабатываться как HTML. Для XML-элементов нужен собственный namespace, http://devedge.netscape.com/2002/de, и ему присваивается префикс myNS (xmlns:myNS="http://devedge.netscape.com/2002/de").

XML-файл

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="example2.xsl"?>
  <myNS:Article xmlns:myNS="http://devedge.netscape.com/2002/de">
    <myNS:Title>My Article</myNS:Title>
    <myNS:Authors>
      <myNS:Author company="Foopy Corp.">Mr. Foo</myNS:Author>
      <myNS:Author>Mr. Bar</myNS:Author>
    </myNS:Authors>
    <myNS:Body>
      The <b>rain</b> in <u>Spain</u> stays mainly in the plains.
    </myNS:Body>
  </myNS:Article>

Используемый XSL-стиль должен иметь два namespace — один для элементов XSLT и один для собственных XML-элементов, используемых в XML-документе. Вывод XSL-стиля настроен на HTML с помощью элемента xsl:output. Установив вывод как HTML и не имея namespace у результирующих элементов (выделенных синим цветом), эти элементы будут обрабатываться как HTML-элементы.

XSL-стиль с 2 namespace

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:myNS="http://devedge.netscape.com/2002/de">

  <xsl:output method="html"/>
  …
</xsl:stylesheet version="1.0">

Создается шаблон, сопоставляющий корневой узел XML-документа, и используется для создания базовой структуры HTML-страницы.

Создание базового HTML-документа

…
<xsl:template match="/">
<html>

  <head>

    <title>
      <xsl:value-of select="/myNS:Article/myNS:Title"/>
    </title>

    <style>
      .myBox {margin:10px 155px 0 50px; border: 1px dotted #639ACE; padding:0 5px 0 5px;}
    </style>

  </head>

  <body>
    <p class="myBox">
      <span class="title">
        <xsl:value-of select="/myNS:Article/myNS:Title"/>
      </span> </br>

      Authors:   <br />
        <xsl:apply-templates select="/myNS:Article/myNS:Authors/myNS:Author"/>
    </p>

    <p class="myBox">
      <xsl:apply-templates select="//myNS:Body"/>
    </p>

  </body>

</html>
</xsl:template>
…

Для завершения примера нужны еще три xsl:template. Первый xsl:template используется для узлов автора, второй обрабатывает узел body. Третий шаблон имеет общее правило сопоставления, которое будет сопоставлять любой узел и любое атрибут. Он необходим для сохранения HTML-элементов в XML-документе, так как сопоставляет все из них и копирует их в HTML-документ, созданный преобразованием.

Последние 3 шаблона

…
<xsl:template match="myNS:Author">
    --   <xsl:value-of select="." />

  <xsl:if test="@company">
    ::   <b>  <xsl:value-of select="@company" />  </b>
  </xsl:if>

  <br />
</xsl:template>
<xsl:template match="myNS:Body">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
…

Окончательный XSLT-стиль выглядит следующим образом:

Окончательный XSLT-стиль

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:myNS="http://devedge.netscape.com/2002/de">

  <xsl:output method="html" />

  <xsl:template match="/">
    <html>

      <head>

        <title>
          <xsl:value-of select="/myNS:Article/myNS:Title"/>
        </title>

        <style>
          .myBox {margin:10px 155px 0 50px; border: 1px dotted #639ACE; padding:0 5px 0 5px;}
        </style>

      </head>

      <body>
        <p class="myBox">
          <span class="title">
            <xsl:value-of select="/myNS:Article/myNS:Title"/>
          </span> <br />

          Authors:   <br />
            <xsl:apply-templates select="/myNS:Article/myNS:Authors/myNS:Author"/>
          </p>

        <p class="myBox">
          <xsl:apply-templates select="//myNS:Body"/>
        </p>

      </body>

    </html>
  </xsl:template>

  <xsl:template match="myNS:Author">
      --   <xsl:value-of select="." />

    <xsl:if test="@company">
      ::   <b>  <xsl:value-of select="@company" />  </b>
    </xsl:if>

    <br />
  </xsl:template>

  <xsl:template match="myNS:Body">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/XSLTProcessor/Generating_HTML

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API