(让我冒一个可能冒犯协议并使我难堪的一般策略问题。)
在将输入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>
第一个策略可能只是暴露了程序语言程序员的想法,但似乎确实有利于让处理器在完成真正的转换之后自行清理。
但XLST 1.0(其中我必须工作,没有扩展)没有一种简单的方法来表示字符串值列表,并且(如果我理解这一点)只能传递回全局变量结果树片段(我无法理解的东西)。所以策略(1)似乎很糟糕。
但是(2),一种从递归内部调用所有真正转换的策略似乎效率低下且难以维护。
这些策略中的一种是最佳实践吗?或者他们都是头脑混乱的证据?
答案 0 :(得分:1)
与Doc Brown一样,我会使用第三种策略:生成目标样式表,然后执行它。可以在浏览器中使用一些Javascript来完成此操作。
答案 1 :(得分:0)
预处理所需的结果是字符串列表(属性值的有序列表),所以:
忽略RTF是树片段并将其视为字符串的事实。在被调用的模板中,不要创建XML节点,只使用value-of和分隔符输出字符串。
全局变量实际上只是一个字符串列表。 (函数substring-before( , delimiter)
和substring-after( , delimiter)
可以为列表形成一个不错的小pop函数。)
因此,首先获得完成预处理(策略1)的好处,而不是从预处理(策略2)的深层内部启动转换,但是通过将全局变量视为RTF而不是作为有序列表来实现字符串。