如何在模板中匹配标记两次?

时间:2017-05-04 18:32:41

标签: html xml xslt xpath

我有xml代码:

<presentation>

<slide type="title-slide" poradie="1">
  <title>Here is title.</title>
  <autor>Name of autor.</autor>
</slide>

</presentation>

这是我的xslt:

<xsl:template match="/presentation/slide">
  <xsl:variable name="filename" select="concat('output_new/',@poradie,'.xhtml')"/>
  <xsl:value-of select="$filename" />
  <xsl:result-document href="{$filename}" format="xhtml">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <style>
          &css;
        </style>
      </head>
      <body>
        <div class="slide">
          <xsl:apply-templates/>
        </div>
      </body>
    </html>
  </xsl:result-document>
</xsl:template>

<xsl:template match="slide[@type = 'title-slide']">
  <div class="container_title_slide">
    <h1><xsl:value-of select="title"/></h1>
    <h3><xsl:value-of select="autor"/></h3>
  </div>
</xsl:template>

所以我想为每张幻灯片创建XHTML文件。我需要将幻灯片标记匹配两次。你能救我吗?

1 个答案:

答案 0 :(得分:1)

目前,两个模板都匹配相同的优先级,这被视为错误

您可以做的是首先为第一个模板提供更高优先级的

<xsl:template match="/presentation/slide" priority="2">

然后,在您的模板正文中,使用<xsl:next-match />而不是<xsl:apply-templates/>,然后使用较低的priorty应用模板(请注意,<xsl:apply-templates/>将查找与子节点匹配的模板,无论如何都不适合在这种情况下使用。)

试试这个XSLT

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

    <xsl:template match="/presentation/slide" priority="2">
      <xsl:variable name="filename" select="concat('output_new/',@poradie,'.xhtml')"/>
      <xsl:value-of select="$filename" />
      <xsl:result-document href="{$filename}" format="xhtml">
        <html>
          <head>
            <style>
              &amp;css;
            </style>
          </head>
          <body>
            <div class="slide">
              <xsl:next-match />
            </div>
          </body>
        </html>
      </xsl:result-document>
  </xsl:template>

    <xsl:template match="slide[@type = 'title-slide']">
      <div class="container_title_slide">
        <h1><xsl:value-of select="title"/></h1>
        <h3><xsl:value-of select="autor"/></h3>
      </div>
    </xsl:template> 
</xsl:stylesheet>

(请注意,我将&css;替换为&amp;css;,因为&css;不是有效的XML实体。)