2015-09-26 2 views
0

Я новичок в XSLT и немного запутался в создании списков. Основном мне нужна структура XML, есть часть его:Tricky inested list XSLT

<slideshow> 
    <slide id="A1"> 
     <title>XML techniques</title> 
     <paragraph> Slideshow prepresents different kind of <bold>XML</bold> techniques </paragraph> 
     <paragraph> Most common XML Techniques are </paragraph> 
     <numberedlist> 
      <item> Basic XML, DTD (version 1.0) </item> 
      <item> XHTML </item> 
      <itemizedlist> 
       <item> XHTML 1.0 </item> 
       <item> XHTML basic </item> 
       <numberedlist> 
        <item> for mobile phones </item> 
        <item> basic set for all XHTML documents</item> 
       </numberedlist> 
      </itemizedlist> 
      <item> XML namespace </item> 
      <item> XSL </item> 
      <itemizedlist> 
       <item> XSLT - template based programming language</item> 
       <item> XSL-FO - formating output like CSS </item> 
      </itemizedlist> 

      <item> Programming API (like SAX and DOM) </item> 
      <item> XML Schemas </item> 
     </numberedlist> 
    </slide> 
.. 
</slideshow> 

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

  1. Basic XML, DTD (версия 1,0)
    • XHTML 1.0
    • XHTML основы
      1. для мобильных телефонов
      2. базовый набор для всех XHTML документов
  2. XHTML
  3. XML пространство имен
  4. XSL
    • XSLT - язык шаблонов программирования на основе
    • XSL-FO - форматирование вывода, как CSS
  5. Программирование AP I (как SAX и DOM)
  6. XML Schemas

Я хотел сделать это как можно более простым, так что я просто использовал шаблоны и никаких сложных XPath масок, но кажется, что нет просто способ .. Могли бы кто-то помогает? Спасибо!

ответ

1

На самом деле, это тривиально в XSLT, из-за его рекурсивного processing model.

XSLT-1,0

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

<xsl:template match="numberedlist"> 
    <ol> 
     <xsl:apply-templates/> 
    </ol> 
</xsl:template> 

<xsl:template match="itemizedlist"> 
    <ul> 
     <xsl:apply-templates/> 
    </ul> 
</xsl:template> 

<xsl:template match="item"> 
    <li> 
     <xsl:value-of select="." /> 
    </li> 
</xsl:template> 

<xsl:template match="text()"/> 

</xsl:stylesheet> 

Результат

<ol> 
    <li> Basic XML, DTD (version 1.0) </li> 
    <li> XHTML </li> 
    <ul> 
     <li> XHTML 1.0 </li> 
     <li> XHTML basic </li> 
     <ol> 
     <li> for mobile phones </li> 
     <li> basic set for all XHTML documents</li> 
     </ol> 
    </ul> 
    <li> XML namespace </li> 
    <li> XSL </li> 
    <ul> 
     <li> XSLT - template based programming language</li> 
     <li> XSL-FO - formating output like CSS </li> 
    </ul> 
    <li> Programming API (like SAX and DOM) </li> 
    <li> XML Schemas </li> 
</ol> 

визуализации:

enter image description here

+0

Чтобы создать правильный HTML, я думаю, потребуется немного больше работы, поскольку HTML не позволяет элементу 'ul' как дочернему элементу элемента' ol', см. Http://www.w3.org/TR/html5/grouping -content.html # the-ol-element или http://www.w3.org/TR/html4/struct/lists.html#h-10.2. Таким образом, структура ввода не может быть сопоставлена ​​непосредственно с допустимой структурой HTML, вам нужно убедиться, что элементы 'ul' помещаются как дочерние элементы из элемента' li', преобразованные из предыдущего элемента item. –