当前位置: 首页 > 知识库问答 >
问题:

XSLT-将一个模板应用于子级,另一个应用于子级的子级

彭存
2023-03-14

我有以下xml文件结构:

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

我的目标是借助xslt文件生成html输出。在这样做的过程中,我想应用一个模板来指导根元素的子元素,该元素将标记的名称输出为标题1,其内容包含在

为了更容易理解我想要的是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

但它不适用于

共有1个答案

景成和
2023-03-14

使用模板匹配来实现您的目标可能会更好,因为这更符合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函数“大写”将元素名称的第一个字符转换为大写,而不是使用XSLT 1.0中使用的“translate”方法

 类似资料:
  • 我有一个XML,我必须循环测试结果和组件。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我为每种组件类型创建了一个XSL-to,具有不同的模板,例如:NORMALTEXTBOX。但是这些模板并没有被应用到组件块中。。。谁能帮我一下吗? XML XSL

  • 我正在尝试为封装在父元素中但具有不同元素名称的元素使用应用模板。在我的示例中,我想将其应用于元素,并选择其中任何一个具有值。此任务是我问的另一个问题的延续。我使用以下XML 我正在使用java应用以下XSLT 1.0。在上面的示例中,我希望模板应用于firstName和lastName,但在firstName中显示值,因为它是第一个有值的。 Java代码是Oracle tuorial页面示例中的S

  • 我有一些限制做一个新的构建。因此,我使用winRAR工具替换了X.jar中的META-INF\maven\com.fasterxml.jackson.core\jackson-databind文件夹。

  • 好的,所以我加载根网址。应该呈现一个帖子列表,相反,我得到了臭名昭着的React错误...... index.js和app.js似乎可以正确呈现。我相信故障出在PostList组件,也许是render方法?我知道解决方法可能很简单,但我看不出来。 index.js 应用.js post-list.js

  • 问题内容: 我有一个具有以下字段的MySQL表: 其中父字段表示上层ID。例如,水果id是1,橙色是水果之一,因此父对象是1。 但是我想做一个有效的MySQL查询来获取所有记录,格式为parent-> children-> parent-> children格式。我怎样才能做到这一点? 查询的结果记录应类似于: 问题答案: 您需要mysql不支持的递归联接。您唯一可以做的就是确定最大深度(由于p-

  • 不具有任何3个属性值(TargetInteresting1、TargetInteresting2、TargetInteresting3)的节点应不加修改地复制到最终结果中。 我正在寻找一个使用XSLT2.0的解决方案。我不知道从何说起,我还不太习惯xslt:-(