2013-03-21 2 views
0

Я хочу, чтобы отформатировать мои заметки об учебе, взять входной файл и вывести чистый HTML-файл. Сегодня я научил себя базовому XML и XSTL (и имел предварительные знания HTML и CSS) для достижения этого. Так что я бы простой XML-файл с содержанием ноты, например, следующее:Использование XML и XSLT для форматирования моих заметок

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?> 
<root> 
    <heading>Programming Fundamentals 48023</heading> 
    <section> 
    <subheading>Classes and Objects</subheading> 
    <point>Something about classes</point> 
    <point>Some else about classes</point> 
    <codeBlock> 
     <text>How to create an instance of a class</text> 
     <code>Class class = new Class();</code> 
    </codeBlock> 
    <point>Something about objects</point> 
    . . . 
    </section> 
    <section> 
    <subheading>Methods</subheading> 
    <point>Something about methods</point> 
    <codeBlock> 
     <text>How to define a method</text> 
     <code>modifiers returnType methodName() { . . . }</code> 
    </codeBlock> 
    . . . 
    </section> 
    . . . 
</root> 

документ XML должен разделить мои заметки в abitrary количество секций, каждый из которых имеет подзаголовок, и произвольное число точки точек и точек с разными форматами блоков кода.

Затем для форматирования документа XML, есть таблицы стилей XSLT (с HTML и CSS и такие), который выглядит примерно так:

<?xsl version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
    <head> 
    <title><xsl:value-of select="root/heading" /></title> 
    <style> 
     body {font-family:Tahoma; } 
     div {width:800px; margin-left:auto; margin-right:auto; } 
     h1 {color:#6FA5FD; border-bottom: 1px dotted #333333; text-indent:64px; } 
     h2 {color:#6FA5FD; border-bottom: 1px dotted #333333; text-indent:96px; } 
     pre {width:640px; border-style:dotted; border-width:1px; border-color:#333333; background-color:#CCCCFF; } 
     ul {list-style-type:square; color:#6FA5FD; } 
     li span {color:#000000; font-size:10; } 
    </style> 
    </head> 
    <body> 
    <div> 
<!-- - - - - - - - - CONTENT STARTS HERE - - - - - - - - --> 

<h1><xsl:value-of select="root/heading" /></h1> 
<xsl:for-each select="root/section"> 
    <h2><xsl:value-of select="subheading" /></h2> 
    <xsl:for-each select="point"> 
     <ul> 
     <li><span> 
      <xsl:value-of select="." /> 
     </span></li> 
     </ul> 
    </xsl:for-each> 
    <xsl:for-each select="codeBlock"> 
     <ul> 
     <li><span> <xsl:value-of select="./text" /> 
      <pre> <xsl:value-of select="./code" /> </pre> 
     </span></li> 
     </ul> 
    </xsl:for-each> 
</xsl:for-each> 

<!-- - - - - - - - - CONTENT ENDS HERE - - - - - - - - --> 
    </div> 
    </body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

Таким образом, XML элемент становится отформатированный HTML элемент, то XML элемент становится форматированным элементом HTML. Отлично. Затем тег XML группирует точки точек и кодовые блоки, и поэтому точки точки просто становятся элементами списка с синими марками и черным текстом, а блоки кода отформатированы в HTML-элементе.

У меня возникают некоторые проблемы:
-У меня нет способа иметь точки точек с разными уровнями отступа. Таким образом, у меня не может быть точки точки, которая говорит, скажем, «Классы», а затем имеет пару точек точки под этим, слегка отступом, которые говорят о том, что класс в одной точке, именования условностей в другой точке, и т.д. Я предположил бы, что решение будет иметь что-то делать с сделать некоторые новые элементы XML, такие как point2, которые будут отформатированы как:

    • POINT

вместо
  • POINT

(дополнительный элемент HTML, вызывающий отступ).
-Если в моем документе XML я определяю различные точки и кодовые блоки в определенном порядке (например, point, point, codeBlock, point, codeBlock, point), полученный HTML-файл после того, как таблица стилей XSLT выполняет свою работу имеет все точки, сгруппированные вместе, и ТОГДА все кодовые блоки (например, точки, точки, точки, точки, кода, кода). Я понимаю, ПОЧЕМУ это происходит; мой XSLT-документ пересекает все элементы XML и THEN через все элементы XML. Я предполагаю, что решение будет иметь какое-то отношение к прохождению всех дочерних узлов элемента и выведение одной вещи, если следующий элемент является элементом, и вывод другой вещи, если следующий элемент является элементом.

Любые идеи? Не стесняйтесь предлагать реструктуризацию документов XML или XSLT. Может быть, я должен использовать атрибуты для отступов или различать точки и codeBlocks?

Thankyou !!

ответ

0

Группировка вы испытываете это хороший повод, чтобы избежать for-each и использовать шаблоны, как в следующем:

<?xsl version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 
    <xsl:output indent="yes" omit-xml-declaration="yes" /> 
    <xsl:template match="/"> 
    <html> 
     <head> 
     <title> 
      <xsl:value-of select="root/heading" /> 
     </title> 
     <style> 
      body {font-family:Tahoma; } 
      div {width:800px; margin-left:auto; margin-right:auto; } 
      h1 {color:#6FA5FD; border-bottom: 1px dotted #333333; text-indent:64px; } 
      h2 {color:#6FA5FD; border-bottom: 1px dotted #333333; text-indent:96px; } 
      pre {width:640px; border-style:dotted; border-width:1px; 
       border-color:#333333; background-color:#CCCCFF; } 
      ul {list-style-type:square; color:#6FA5FD; } 
      li span {color:#000000; font-size:10; } 
     </style> 
     </head> 
     <body> 
     <div> 
      <!-- - - - - - - - - CONTENT STARTS HERE - - - - - - - - --> 

      <h1> 
      <xsl:value-of select="root/heading" /> 
      </h1> 
      <xsl:apply-templates select="root/section" /> 

      <!-- - - - - - - - - CONTENT ENDS HERE - - - - - - - - --> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="section"> 
    <h2> 
     <xsl:value-of select="subheading" /> 
    </h2> 

    <xsl:apply-templates select="." mode="list" /> 
    </xsl:template> 

    <xsl:template match="*[point or codeBlock]" mode="list"> 
    <ul> 
     <xsl:apply-templates select="point | codeBlock" /> 
    </ul> 
    </xsl:template> 
    <xsl:template match="*" mode="list" /> 

    <xsl:template match="point"> 
    <li> 
     <span> 
     <xsl:apply-templates select="text()" /> 
     </span> 
     <xsl:apply-templates select="." mode="list" /> 
    </li> 
    </xsl:template> 

    <xsl:template match="codeBlock"> 
    <li> 
     <span> 
     <xsl:value-of select ="text" /> 
     <pre> 
      <xsl:value-of select ="code" /> 
     </pre> 
     </span> 
    </li> 
    </xsl:template> 
</xsl:stylesheet> 

Я также включил изменения выше для обработки точек многоуровневые, так что вы можете сделать это:

<point> 
    I have a point. 
    <point> 
    This is a sub point 
    <point>With a sub-sub point beneath it</point> 
    </point> 
    <point>This is just a sub point</point> 
</point> 

и полученный XML будут вложены LIS и ULS:

<li> 
    <span> 
    I have a point. 
    </span> 
    <ul> 
    <li> 
     <span> 
     This is a sub point 
     </span> 
     <ul> 
     <li> 
      <span>With a sub-sub point beneath it</span> 
     </li> 
     </ul> 
    </li> 
    <li> 
     <span>This is just a sub point</span> 
    </li> 
    </ul> 
</li> 
+0

Я в страхе ... все работает отлично! Спасибо за быстрый ответ! Я читаю это сейчас и пытаюсь понять это - я также рассмотрю некоторые учебники для шаблонов. Еще раз спасибо! – Luke

Смежные вопросы