0

入力ファイルを取得してクリーンな HTML ファイルを出力する、研究ノートをフォーマットする方法が必要です。これを達成するために、私は今日、基本的な XML と XSTL を独学しました (そして、HTML と CSS の予備知識を持っています)。したがって、次のようなメモの内容を含む単純な XML ファイルが作成されます。

<?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 ドキュメントでは、メモを任意の数のセクションに分割し、それぞれに小見出しを付け、任意の数のドット ポイントと異なる形式のコード ブロックを含むドット ポイントにする必要があります。

次に、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 要素でフォーマットされます。

ただし、いくつかの問題があります。 -
インデントのレベルが異なるドット ポイントを使用する方法がありません。したがって、たとえば「クラス」というドット ポイントを配置し、その下にいくつかのドット ポイントを配置して、わずかにインデントして、あるポイントでクラスとは何かを説明し、別のポイントで命名規則を説明することはできません。など。解決策は、次のようにフォーマットされるpoint2などの新しいXML要素を作成することに関係があると思います。


それ以外の

(インデントの原因となる余分な HTML 要素)。
-私の XML ドキュメントで、さまざまなドット ポイントとコード ブロックを特定の順序 (たとえば、ポイント、ポイント、codeBlock、ポイント、codeBlock、ポイント) で定義すると、XSLT スタイルシートが機能した後の結果の HTML ファイルにはすべてが含まれます。ポイントがまとめられ、すべての codeBlocks (たとえば、ポイント、ポイント、ポイント、ポイント、codeBlock、codeBlock など) がまとめられます。なぜこれが起こるのか理解しています。私の XSLT ドキュメントは、すべての XML 要素をループし、すべての XML 要素を THEN でループします。解決策は、要素のすべての子ノードをループし、次の要素が要素である場合は 1 つを出力し、次の要素が要素である場合は別のものを出力することと関係があると思います。

何か案は?XML 文書または XSLT 文書のいずれかの再構築を自由に提案してください。たぶん、インデントに属性を使用したり、ポイントとコードブロックを区別したりする必要がありますか?

ありがとうございました!!

4

1 に答える 1

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 にはネストされた LI と UL が含まれます。

<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>
于 2013-03-21T13:14:51.620 に答える