используйте xsl для вывода HTML - PullRequest
1 голос
/ 09 мая 2011

Выходные данные должны быть html, а затем выводить оглавление, следующее за xml

<!DOCTYPE book SYSTEM "book.dtd">

<book title="D">
<author>
  <name>abc</name>
</author>

<chapter title="chapter1">
  <section title="section1.1"/>
  <section title="section1.2">
    <section title="section1.2.1"/>
<section title="section1.2.2"/>
  </section>
  <section title="section3">
<section title="section3.1"/>
  </section>
</chapter>

<chapter title="chapter2"/>

</book>

мой шаблон:

   <xsl:template match="book"  as="element(xhtml:html)">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
            <title>
                <xsl:value-of  select="@title"/>
            </title>
        </head>
        <body>
            <h2>
                <xsl:value-of select="@title"/>
            </h2>
            <p>
                by <xsl:value-of select="author"/>
            </p>
            <h3>Table of contents</h3>
            <ul>
                <xsl:apply-templates select="chapter"/>
           </ul>
        </body>
    </html>
    </xsl:template>
     <xsl:template match="chapter|section" as="element()*">
     <xsl:param name ="seq" as="element(section)*"/>
        <li xmlns="http://www.w3.org/1999/xhtml">
            <xsl:value-of select="@title"/>

            <xsl:apply-templates select ="section"/>

        </li>
   </xsl:template>

</xsl:transform>

мой HTML-код неправильный

    <body>
      <h2>D</h2>
      <p>
         by abc
      </p>
      <h3>Table of contents</h3>
      <ul>
         <li>chapter1
            <li>section1.1</li>
            <li>section1.2
               <li>section1.2.1</li>
               <li>section1.2.2</li>
            </li>
            <li>section3
               <li>section3.1</li>
            </li>
         </li>
         <li>chapter2</li>
      </ul>
   </body>

Результат должен быть:

<body>
      <h2>D</h2>
      <p>
         by abc
      </p>
      <h3>Table of contents</h3>
      <ul>
         <li>chapter1
         <ul>
            <li>section1.1</li>
            <li>section1.2
            <ul>
               <li>section1.2.1</li>
               <li>section1.2.2</li>
            </ul>
            </li>
            <li>section3
            <ul>
               <li>section3.1</li>
            </ul>
            </li>
         </ul>
         </li>
         <li>chapter2</li>
      </ul>
   </body>

Ответы [ 4 ]

1 голос
/ 09 мая 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

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

 <xsl:template match="book/@title">
  <h2><xsl:value-of select="."/></h2>
 </xsl:template>

 <xsl:template match="author">
  <p>by <xsl:value-of select="name"/></p>

  <h3>Table of Contents</h3>
   <ul>
     <xsl:apply-templates mode="TC"
      select="following-sibling::*"/>
   </ul>
 </xsl:template>

 <xsl:template mode="TC"
   match="chapter[section]|section[section]">
    <li><xsl:value-of select="@title"/>
      <ul>
          <xsl:apply-templates mode="TC"/>
      </ul>
    </li>
 </xsl:template>

 <xsl:template mode="TC" match=
 "chapter[not(section)]|section[not(section)]">
  <li><xsl:value-of select="@title"/></li>
 </xsl:template>

 <xsl:template match="chapter|section"/>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<book title="D">
    <author>
        <name>abc</name>
    </author>
    <chapter title="chapter1">
        <section title="section1.1"/>
        <section title="section1.2">
            <section title="section1.2.1"/>
            <section title="section1.2.2"/></section>
        <section title="section3">
            <section title="section3.1"/></section>
    </chapter>
    <chapter title="chapter2"/>
</book>

дает желаемый, правильный результат :

<body>
   <h2>D</h2>
   <p>by abc</p>
   <h3>Table of Contents</h3>
   <ul>
      <li>chapter1<ul>
            <li>section1.1</li>
            <li>section1.2<ul>
                  <li>section1.2.1</li>
                  <li>section1.2.2</li>
               </ul>
            </li>
            <li>section3<ul>
                  <li>section3.1</li>
               </ul>
            </li>
         </ul>
      </li>
      <li>chapter2</li>
   </ul>
</body>

и отображается в браузере как :

* * D тысячу двадцать-один

от abc

Содержание

  • chapter1
    • 1031 * Раздел 1.1 *
    • section1.2
      • section1.2.1
      • section1.2.2
    • section3
      • section3.1
  • chapter2

0 голосов
/ 09 мая 2011

Попробуйте добавить следующий шаблон в таблицу стилей:

<xsl:template match="section/section[1]" as="element()*">
    <ul>
        <li xmlns="http://www.w3.org/1999/xhtml">
            <xsl:value-of select="@title"/>
        </li>
        <xsl:apply-templates select ="following-sibling::section"/>
    </ul>
</xsl:template>
0 голосов
/ 09 мая 2011

ОК, поэтому предоставленный вами шаблон неполон, поэтому я не могу точно сказать, что вам нужно делать. Но в целом вам нужно создать шаблон, соответствующий элементу book, который использует apply-templates для вызова шаблонов для дочерних элементов. Для глав это может выглядеть как

<xsl:template match="book">
  <xsl:apply-templates match="author" />
  <ul>
    <xsl:apply-templates match="chapter" />
  </ul>
</xsl:template>
0 голосов
/ 09 мая 2011

Попробуйте обернуть <xsl:apply-templates select ="section"/> в <ul>...</ul> теги. Отказ от ответственности: Прошло довольно много времени с тех пор, как я использовал XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...