3

我正在做一些非常复杂的 XSLT 1.0 转换(目前使用 8 个 XSLT 通道)。我想组合这 8 个通道而不将它们合并到一个文件中(这太复杂了)。我的解决方案是使用xsl:includeexsl:node-set合并通行证并将临时结果存储在变量中。

但是我有一个问题:我的转换传递复制了大部分节点并且只修改了某些方面。因此,我需要在每次传递中处理相同的节点,但使用不同的 xsl:template!但是我该怎么做呢?如何判断在第一次通过后我想应用来自其他 XSLT 样式表的模板?

我目前正在做的非常简化的示例(2 XSLT 通过):

来源:

<h>something here</h>

在 XSLT 通过 1 之后:

<h someattribute="1">something here</h>

在 XSLT 通过 2 之后:

<h someattribute="1" somemoreattribute="2">something here, and even more</h>

我目前的方法是调用 XSLT 处理器两次并将结果临时保存在磁盘上:

xsltproc stylesheet1.xsl input.xml >temp.xml
xsltproc stylesheet2.xsl temp.xml >finalresult.xml
4

2 回答 2

2

一种可能的解决方案是更改每个样式表以使用不同的模式。然后您可以将它们全部导入您的主样式表并通过依次使用每种模式应用模板来执行多次传递:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl"
                version="1.0">

  <xsl:import href="stylesheet1.xsl"/> <!-- assuming mode="stylesheet1" -->
  <xsl:import href="stylesheet2.xsl"/> <!-- assuming mode="stylesheet2" -->
  <xsl:import href="stylesheet3.xsl"/> <!-- assuming mode="stylesheet3" -->

  <xsl:template match="/">
    <xsl:variable name="temp1">
      <xsl:apply-templates select="." mode="stylesheet1"/>
    </xsl:variable>
    <xsl:variable name="temp2">
      <xsl:apply-templates mode="stylesheet2" select="exsl:node-set($temp1)"/>
    </xsl:variable>
    <xsl:apply-templates mode="stylesheet3" select="exsl:node-set($temp2)"/>
  </xsl:template>

</xsl:stylesheet>

缺点是您需要修改原始样式表,为每个和添加适当的mode属性。您仍然可以通过在每个样式表中添加一个像这样的额外模板来使样式表也独立工作:xsl:templatexsl:apply-templates

<xsl:template match="/">
  <xsl:apply-templates select="." mode="stylesheet1"/>
</xsl:template>
于 2011-07-21T20:49:23.810 回答
0

为什么不使用

<xsl:param name="iteration"/>

并将迭代号传递给样式表?然后你可以像这样使用它

<xsl:if test="$iteration = 1">
  ...
</xsl:if>

...或在其他情况下

您可以设置参数

javax.xml.transform.Transformer.setParameter("iteration", 1);

或者用蚂蚁:

<xslt ...>
  <param name="iteration" expression="1"/>
</xslt>
于 2011-07-21T09:29:27.933 回答