代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

XSLT:合并样式表

  •  0
  • OMG Ponies  · 技术社区  · 16 年前

    我的问题是,我是否可以在一个样式表中执行这两个操作。

    <xsl:template match="xs:complexType">
      <xsl:param name="prefix" />       
      <xs:complexType name="{my:updateName($prefix, @name)}">
    
        <!-- insert xs:sequence ONLY if the child is NOT xs:complexContent -->
        <xsl:choose>
          <xsl:when test="*[name()='xs:complexContent']">
            <xsl:apply-templates select="node()" />
          </xsl:when>
          <xsl:otherwise>
            <xs:sequence>
              <xsl:apply-templates select="node()" />
            </xs:sequence>              
          </xsl:otherwise>
        </xsl:choose>
      </xs:complexType>
      <xsl:apply-templates select=".//xs:element" />
    </xsl:template>
    

    pass2.xsl:

    <xsl:template match="xs:complexType">
      <xsl:copy>
        <xsl:apply-templates select="*|@*"/>
      </xsl:copy>
    </xsl:template>
    

    重申一下,目标是只运行一个样式表来生成最终结果。 运行两个并不困难,但不用这样做会很好;让它发挥作用,还是导入/包含我应该关注的内容?我宁愿只有一个样式表文件,以尽量减少有人错误删除支持文件的可能性。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Pavel Minaev    16 年前

    modes mode 归属于所有 xsl:template xsl:apply-templates exsl:node-set 是事实上的标准(请注意,支持它的处理器的完整列表比该页面上的要大,例如.NET XslCompiledTransform

    <xsl:template match="/">
       <xsl:variable name="round1-output">
         <xsl:apply-templates select="/" mode="round1" />
       </xsl:variable>
       <xsl:apply-templates select="exsl:node-set($round1-output)" mode="round2" />
    </xsl:template>
    
    <xsl:template match="/" mode="round1">
       ...
       <xsl:apply-templates mode="round1" />
       ...
    </xsl:template>
    
    <xsl:template match="/" mode="round2">
       ...
       <xsl:apply-templates mode="round2" />
       ...
    </xsl:template>
    
    ...
    
    <xsl:template match="xs:complexType" mode="round1">
      <xsl:param name="prefix" />           
      <xs:complexType name="{my:updateName($prefix, @name)}">
        <!-- insert xs:sequence ONLY if the child is NOT xs:complexContent -->
        <xsl:choose>
          <xsl:when test="*[name()='xs:complexContent']">
            <xsl:apply-templates select="node()" mode="round1"/>
          </xsl:when>
          <xsl:otherwise>
            <xs:sequence>
              <xsl:apply-templates select="node()" mode="round1"/>
            </xs:sequence>                          
          </xsl:otherwise>
        </xsl:choose>
      </xs:complexType>
      <xsl:apply-templates select=".//xs:element" mode="round1"/>
    </xsl:template>
    
    <xsl:template match="xs:complexType" mode="round2">
      <xsl:copy>
        <xsl:apply-templates select="*|@*" mode="round2"/>
      </xsl:copy>
    </xsl:template>