1

我有一个关于 XSLT 的问题。我知道 XSLT 可用于将 XML 转换为另一个 XML。假设有一个名为data.xml

<data>
  <field>
    <attr>Attribute 1</attr>
    <attr>Attribute 2</attr>
  </field>
</data>

假设有一个名为 xsl 的文件transform.xsl,并且another.xsl
两个文件都定义了如何以data.xml类似的方式进行转换。
transform.xsl包括another.xsl
假设我想让transform.xsl转换为foo.html并让另一个.xsl的转换附加在上面foo.html,有人知道如何实现吗???
我现在遇到的另一个问题是,因为<xsl:include>可以覆盖模板,所以只有一个会生效。是否可以<xsl:template>多次调用相同的?

4

1 回答 1

1

您可以使用模式来区分处理步骤 (<xsl:template match="field" mode="m1">...</xsl:template><xsl:template match="data"><xsl:apply-templates select="field" mode="m1"/></xsl:template>),但当然这需要创作another.xsl或编辑它以使用模式。

其次,由于您已将问题标记为 XSLT 2.0,因此您还可以选择使用<xsl:next-match/>,请参阅http://www.w3.org/TR/xslt20/#element-next-match

为了给你一个使用模式的例子,主要的样式表是

<xsl:stylesheet version="2.0" exclude-result-prefixes="xs"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xsl:include href="test2013080802.xsl"/>

    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
      <html lang="en">
        <head>
          <title>Example</title>
        </head>
        <body>
          <h1>Example</h1>
          <xsl:apply-templates/>
        </body>
      </html>
    </xsl:template>

    <xsl:template match="data">
      <table>
        <thead>
          <xsl:apply-templates select="field[1]" mode="thead"/>
        </thead>
        <tbody>
          <xsl:apply-templates/>
        </tbody>
      </table>
      <xsl:apply-templates select="." mode="list"/>
    </xsl:template>

    <xsl:template match="field" mode="thead">
      <tr>
        <xsl:apply-templates mode="thead"/>
      </tr>
    </xsl:template>

    <xsl:template match="field/*" mode="thead">
      <th><xsl:value-of select="local-name()"/></th>
    </xsl:template>

    <xsl:template match="field">
      <tr>
        <xsl:apply-templates/>
      </tr>
    </xsl:template>

    <xsl:template match="field/*">
      <td><xsl:value-of select="."/></td>
    </xsl:template>

</xsl:stylesheet>

包含的然后使用名为的模式list

<xsl:stylesheet version="2.0" exclude-result-prefixes="xs"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/" mode="list">
      <html lang="en">
        <head>
          <title>Example</title>
        </head>
        <body>
          <h1>Example</h1>
          <xsl:apply-templates mode="#current"/>
        </body>
      </html>
    </xsl:template>

    <xsl:template match="data" mode="list">
      <ul>
        <xsl:apply-templates mode="#current"/>
      </ul>
    </xsl:template>

    <xsl:template match="field" mode="list">
      <li>
        <xsl:apply-templates select="*" mode="#current"/>
      </li>
    </xsl:template>

    <xsl:template match="field/*" mode="list">
      <xsl:if test="position() > 1">, </xsl:if>
      <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

那么输出是

<html lang="en">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Example</title>
   </head>
   <body>
      <h1>Example</h1>
      <table>
         <thead>
            <tr>
               <th>attr</th>
               <th>attr</th>
            </tr>
         </thead>
         <tbody>
            <tr>
               <td>Attribute 1</td>
               <td>Attribute 2</td>
            </tr>
         </tbody>
      </table>
      <ul>
         <li>Attribute 1, Attribute 2</li>
      </ul>
   </body>
</html>
于 2013-08-07T08:45:24.710 回答