使用xslt将xml转换为csv文件

时间:2011-11-10 02:28:22

标签: java xml templates xslt xalan

我遇到了xsl:templates和xsl:call-template标签的问题。也许这是一种缺乏理解,但这就是我想要做的......

如果我有一个与“/ *”匹配的模板,并且我需要在封闭模板中调用其他需要其他文档上下文的模板,那么最有效的方法是什么?

<xsl:template match="/*">

<xsl:call-template name="header">
  <xsl:with-param name="headerContext" select="./[1]"/>
</xsl:call-template>

<xsl:call-template name="body">
  <xsl:with-param name="bodyContext" select="*/*/[1]"/>
</xsl:call-template>

<xsl:template>

我在调用头文件和正文模板时使用xsl:with-param,这样我就可以覆盖封闭模板中的match =“/ *”,但是当我这样做时,输出就搞砸了。如果我注释掉对“标题”模板的调用,则正文模板可以正常工作,反之亦然,但是如上例所示,从主模板调用两者会使它们表现得很奇怪。标题和正文模板需要选择文档的不同部分,这就是我选择使用w0th-param的原因,但我认为它甚至不起作用。

我应该使用apply-templates吗?

1 个答案:

答案 0 :(得分:0)

XSL旨在基于事件。因此,通常情况下,您需要使用模板匹配而不是明确指定要处理的后代。

<!-- Identity Template will copy every node to the output. -->
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<!-- You listed ./[1] as your xpath, but you might want to add more information 
   to make it more specific.  i.e. element names, not just * and position. -->
<xsl:template match="/*/header">
   <someOutputHeader><xsl:apply-templates /></someOutputHeader>
</xsl:template>

<xsl:template match="/something/*/body">
   <newBody><xsl:apply-templates /></newBody>
</xsl:template>

此外,最好在谓词之前指定nodeTest。因此,例如,您可以在斜杠后指定*,而不是写“./ [1]”。 “./ * [1]”你也不需要使用“./”。它是由xpath暗示的。真的,这是“* [1]”