在多个地方使用一个XML数据

时间:2010-01-17 20:51:50

标签: xml xslt symphony-cms

如何多次转换XML文档的一部分?

我正在一个样式表中为特定节点调用模板。当我导入另一个转换相同数据的实用程序时,原始工作停止工作。

如何让两个样式表都起作用?

2 个答案:

答案 0 :(得分:1)

很难在不看样式表的情况下进行诊断,但我怀疑您的导入样式表和导入的样式表具有相同匹配条件或相同名称的模板导入样式表已“覆盖”导入的样式表模板,阻止其执行。

导入的样式表的优先级低于顶级样式表中的模板。

您可以在主样式表模板中使用<xsl:apply-imports />为该节点应用导入的模板。

<xsl:template match="foo">
  <!--First, turn foo into bar -->
  <bar>
    <xsl:apply-templates />
  </bar>
  <!--Now, apply the template from the imported file to do whatever it does-->
  <xsl:apply-imports />
</xsl:template>

您还可以使用模式为给定节点定义多个模板,然后以不同模式应用模板来控制它们何时执行。

http://www.dpawson.co.uk/xsl/sect2/modes.html

  

例如,如果您想申请   来自的style1.xsl或style2.xsl   style.xsl,你可以定义所有   style1.xsl中的模板   mode =“style1”(并使用模式   在所有调用模板中也属性   apply-templates)和所有模板   style2.xsl with mode =“style2”。

     

然后,你可以有一个style.xsl   包含以下内容的样式表

<xsl:include href="style1.xsl"/>
<xsl:include href="style2.xsl"/>

<xsl:template match="some pattern">
  <xsl:choose>
    <xsl:when test="some test">
      <xsl:apply-templates select="." mode="style1"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="." mode="style2"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

答案 1 :(得分:0)

如果可能,请使用模板名称,而不是数据匹配。

使用此

<xsl:call-template name="test" />

<xsl:template name="test">
    <!-- content -->
</xsl:template>

不是这个

<xsl:template match="test/entry">
    <!-- content -->
</xsl:template>