XSLT - 将一个模板应用于儿童,将另一个模板应用于儿童

时间:2013-01-09 10:38:30

标签: html xml templates xslt children

我遵循xml文件的结构:

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

我的目标是借助xslt文件生成html输出。在这样做时,我想应用一个模板来指导根元素的子元素,它将标记的名称输出为标题1,并将其内容包含在&lt; p&gt;&lt; / p&gt;中。至于grandchildern,我想使用几乎相同的模板,但输出他们的名字作为标题2。

为了更容易理解我想要的是HTML-Output的样子:

<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

但它不适用于&lt; xsl:for-each select =“./*”&gt;和&lt; xsl:for-each select =“./。/ *”&gt;所以我想请你帮忙。

1 个答案:

答案 0 :(得分: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,则可以使用xpath函数“大写”来将元素名称的第一个字符转换为大写,而不是使用“translate”方法。 XSLT 1.0