如何在保持标签原始顺序的同时使用xslt设置xml样式?

时间:2012-08-01 15:37:45

标签: html xml xslt

这是问题所在。我有一个xml文件,其中有多个标签,根据谁写的,可能最终以任何顺序。我需要创建一个xls文件来设置样式,同时保持标签的原始顺序。这是xml:

<content>
<h>this is a header</h>
<p>this is a paragraph</p>
<link>www.google.com</link>
<h> another header!</h>
</content>

1 个答案:

答案 0 :(得分:0)

XSLT不会自行重新排序元素,除非你告诉它这样做。如果你匹配元素,并用其他元素替换它们,它将按照我找到的顺序处理它们。

如果您希望简单地用HTML元素替换元素,您只需为每个元素编写匹配的模板,您可以在其中输出所需的HTML元素。例如,要用 h1 元素替换 h 元素,您可以执行此操作

<xsl:template match="h">
   <h1>
      <xsl:apply-templates select="@*|node()"/>
   </h1>
</xsl:template>

h1 元素将在 h 元素在原始文档中的位置输出。这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>

   <xsl:template match="content">
      <body>
         <xsl:apply-templates select="@*|node()"/>
      </body>
   </xsl:template>

   <xsl:template match="h">
      <h1>
         <xsl:apply-templates select="@*|node()"/>
      </h1>
   </xsl:template>

   <xsl:template match="link">
      <a href="{text()}">
         <xsl:apply-templates select="@*|node()"/>
      </a>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

应用于样本文档时,输出以下内容

<body>
   <h1>this is a header</h1>
   <p>this is a paragraph</p>
   <a href="www.google.com">www.google.com</a>
   <h1> another header!</h1>
</body>