2012-01-05 47 views
2

(让我风险总体战略问题可能冒犯协议和为难我。)XSLT 1.0初步处理策略

我输入XML转换成HTML的元素乘元素转换之前,我需要确定的顺序其中将呈现元素。这样做需要递归分析,包括合并有序列表和跟踪图形,全部基于要呈现的元素的属性。

经过那个处理后,我实际上得到了一个有序的属性值列表,并且我将呈现按该列表排序的元素。

哪种策略更好?

1)将预分析的结果为一个全局变量,这将是属性值的列表,然后通过该列表循环,这样的事情:

<xsl:variable name=orderOfPresentation> 
    <xsl:call-template name="analyses"> 
</xsl:variable> 


<xsl:template match="root"> 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

2)应用格式深的分析,一旦确定有序列表模板,没有收出递归,是这样的:

<xsl:template match="root"> 
    <xsl:call-template name="analysis"> 
     [with, as parameters, various sets of attribute nodes, extracted from the input XML] 
    </xsl:call-template> 
</xsl:template> 


<xsl:template name="analysis"> 
    [recursions that include calls to sub-analysis] 
</xsl:template> 

<xsl:template name="sub-analysis"> 
    [recursions that include calls to sub-sub-analysis]] 
</xsl:template> 

<xsl:template name="sub-sub-analysis"> 
    [more work, which eventually produces an ordered list, $orderOfPresentation] 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

在F第一种策略可能只是暴露程序语言程序员的想法,但似乎有利于在处理真正的变革业务之前让处理器清理干净。

但是,XLST 1.0(我必须在其中工作,没有扩展名)没有简单的方法来表示字符串值列表,并且(如果我正确理解这一点)只能传递回全局变量a Result树片段(我不明白的东西)。所以战略(1)看起来很糟糕。但是(2),一种从递归内部调用所有真实转换的策略似乎效率低下,难以维护。

这些策略之一是最佳实践吗?还是他们都是头脑混乱的证据?

+0

环境是如何看待您的XSLT处理器从哪里调用的?是否有机会将第一个XSLT程序应用于排序,将结果XML存储在某处并通过第二个执行“XML到HTML”转换的XSLT程序来处理?这是我想在这里尝试的。 – 2012-01-05 17:30:42

+0

转换正在客户端完成,在Web浏览器中。所以,不,我不能存储中间XML。 – JPM 2012-01-05 17:33:21

+0

嗯,我对JavaScript没有太多了解,但是不可能通过使用JavaScript来达到目的?这个例子http://www.w3schools.com/xsl/xsl_client.asp看起来像它可以很容易地修改两次运行XSLT处理器。 – 2012-01-05 17:38:07

回答

0

预处理的需要的结果是一个字符串列表(属性值的有序列表),所以:

忽视的事实是一个RTF是一个树片段,只是把它当作一个字符串。在被调用的模板中,不要创建XML节点,只需使用value-of plus分隔符输出字符串。

全局变量只是一个字符串列表。 (该功能substring-before(, delimiter)substring-after(, delimiter)可以形成列表中一个可爱的小流行功能。)

因此,获得第一完成预处理的好处(策略1),而不是从深预处理内启动转型(策略2)但是通过将全局变量视为不是RTF,而是将其视为有序的字符串列表来实现。

+0

我不能依赖节点集()扩展,因为这是浏览器中的客户端转换。我想避免使用Javascript来使样式表易于他人使用,适应和维护。这里的策略是轻量级的,目前运行良好。 – JPM 2012-01-07 18:37:23

1

和Doc Brown一样,我会使用第三种策略:生成目标样式表,然后执行它。这很有可能在浏览器中用一些Javascript来完成。