0

私はxmlファイルの構造に従っています:

<root-element>
    <child1>
        Some text
    </child1>
    <child2>
        <grandchild>
            Some text
        </grandchild>
    </child2>
</root-element>

私の目的は、xslt ファイルを使用して html 出力を生成することです。そうすることで、ルート要素の直接の子にテンプレートを適用したいと思います。これは、タグの名前を見出し 1 として出力し、その内容を <p></p> で囲みます。孫に関しては、ほぼ同じテンプレートを使いたいのですが、見出し2として名前を出力したいです。

ここで何が欲しいかを理解しやすくするために、HTML 出力がどのように見えるかのサンプルを示します。

<html>
    <head>
        <title>Sample</title>
    </head>
    <body>
        <h1>Child1</h1>
        <p>Some text</p>

        <h1>Child2</h1>
        <h2>Grandchild</h2>
        <p>Some text</p>
    </body>
</html>

今、私の試みは次のようになります: http://pastebin.com/wKgSLbcE

しかし、<xsl:for-each select="./*"> と <xsl:for-each select="././*"> では動作しないので、助けを求めたいです。

4

1 に答える 1

1

テンプレートマッチングを使用して目的を達成する方がよい場合があります。これは、XSLTの精神に基づいているためです。

たとえば、「子」要素を一致させるには、どのような名前でもかまいませんが、次のようにして、最上位要素の子要素を一致させることができます。

<xsl:template match="/*/*">
   <h1>
      <!-- Output name here -->
   </h1>
   <xsl:apply-templates />
</xsl:template>

同様に、孫の要素を一致させるには、これを使用します

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

段落に関しては、テキストノードに一致するテンプレートがあります

<xsl:template match="text()">
   <p>
      <xsl:value-of select="normalize-space(.)" />
   </p>
</xsl:template>

これが完全なXSLTです

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output version="4.0" method="html" indent="no" encoding="UTF-8" use-character-maps="spaces" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>

   <xsl:template match="/*">
      <html>
         <head>
            <title>Abschlussarbeit</title>
         </head>
         <body>
            <xsl:apply-templates />
         </body>
      </html>
   </xsl:template>

   <xsl:template match="/*/*">
      <h1>
         <xsl:value-of select="concat(translate(substring(name(), 1, 1), abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ), substring(name(), 2))"/>
      </h1>
      <xsl:apply-templates />
   </xsl:template>

   <xsl:template match="/*/*/*">
      <h2>
         <xsl:value-of select="concat(translate(substring(name(), 1, 1), abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ), substring(name(), 2))"/>
      </h2>
      <xsl:apply-templates />
   </xsl:template>

   <xsl:template match="text()">
      <p>
         <xsl:value-of select="normalize-space(.)" />
      </p>
   </xsl:template>
</xsl:stylesheet>

XMLに適用すると、次のように出力されます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <META http-equiv="Content-Type" content="text/html">
      <title>Abschlussarbeit</title>
   </head>
   <body>
      <h1>child1</h1>
      <p>Some text</p>
      <h1>child2</h1>
      <h2>grandchild1</h2>
      <p>Some text</p>
   </body>
</html>

XSLT 2.0を使用している場合は、XSLT 1.0で使用されている「変換」メソッドを使用するのではなく、要素名の最初の文字を大文字に変換するために使用できるxpath関数「大文字」があることに注意してください。

于 2013-01-09T11:10:22.700 に答える