将较大的xslt拆分为较小的xslt

时间:2014-04-28 09:21:28

标签: xslt split

我有一个大的xslt文件在部署期间出现问题

com.sun.org.apache.bcel.internal.generic.ClassGenException:分支目标偏移量太大而不是简短         在com.sun.org.apache.bcel.internal.generic.BranchInstruction.dump(BranchInstruction.java:99)         at com.sun.org.apache.bcel.internal.generic.InstructionList.getByteCode(InstructionList.java:980)         在com.sun.org.apache.bcel.internal.generic.MethodGen.getMethod(MethodGen.java:616)         at com.sun.org.apache.xalan.internal.xsltc.compiler.Mode.compileNamedTemplate(Mode.java:556)         at com.sun.org.apache.xalan.internal.xsltc.compiler.Mode.compileTemplates(Mode.java:566)         在com.sun.org.apache.xalan.internal.xsltc.compiler.Mode.compileApplyTemplates(Mode.java:818)         at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.compileModes(Stylesheet.java:615)         at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.translate(Stylesheet.java:730)         在com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:370)         在com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:445)

为此,我需要将这个大的xslt拆分成更小的xslt。 我见过xsl:include标签,但看起来这适用于单独的模板。

在我的情况下,它是一个包含多个分配的单个父标记,如

<xsl:template match="/">
<ns5:taskListResponse>
  <xsl:for-each select="/tns:taskListResponse/task:task">
    <ns7:task>
      <xsl:if test="task:title">
        <ns7:title>
          <xsl:value-of select="task:title"/>
        </ns7:title>
      </xsl:if>
      <xsl:if test="task:taskDefinitionURI">
        <ns7:taskDefinitionURI>
          <xsl:value-of select="task:taskDefinitionURI"/>
        </ns7:taskDefinitionURI>
      </xsl:if>
      <xsl:if test="task:creator">
        <ns7:creator>
          <xsl:value-of select="task:creator"/>
        </ns7:creator>
      </xsl:if>
      ........100 more tags like this.....
      ...................
      </xsl:for-each>
</ns5:taskListResponse>

如何分割这个xsl? 我想在另一个文件中放入一些标签,并将其包括在内 感谢您的帮助

此致 拉维

1 个答案:

答案 0 :(得分:1)

我会考虑将其拆分为单独的模板,例如,每个if测试都可以替换为apply-templates,并使用以下模板来完成工作:

<xsl:template match="task:*">
  <xsl:element name="ns7:{local-name()}">
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>

如果您不需要重新订购孩子,那么整个样式表可以归结为

<xsl:template match="/">
  <ns5:taskListResponse>
    <xsl:apply-templates select="/tns:taskListResponse/task:task" />
  </ns5:taskListResponse>
</xsl:template>

<xsl:template match="task:task">
  <ns7:task><xsl:apply-templates select="*" /></ns7:task>
</xsl:template>

<xsl:template match="task:*">
  <xsl:element name="ns7:{local-name()}">
    <xsl:value-of select="." />
  </xsl:element>
</xsl:template>

如果您确实需要重新排序,那么会稍微复杂一些,那么您需要100个单独的<xsl:apply-templates select="task:foo" />代替<xsl:apply-templates select="*" />,但它仍然更小,更模块化。