我想知道是否存在简单而干净的递归XSLT标识转换的非递归替代方法(如下所示)?我被告知XSLT递归模板会对性能产生影响,因此我可能不允许在当前项目中使用它们。
身份转换模板:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
提前致谢!
答案 0 :(得分:2)
问题本身是错误的。
以最优雅的形式表达您的转型,让XSLT处理器担心优化,实际上 衡量 表现 - 不要猜测,然后优化实际瓶颈。
无论如何,您都可能没有性能问题需要进一步关注。
答案 1 :(得分:2)
如果你真的想避免递归,你基本上有三个选择:
使用一个模板,匹配文档(/
)并完成所有输出
在该模板中,没有使用<xsl:apply-templates>
。
但是,这是非常糟糕的XSLT设计。
使用文字结果元素 - 整个样式表实际上只是
输出xml / html,但声明了xsl名称空间,并且在key处
使用<xsl:value-of/>
指令进行分数。编辑:考虑一下,这与第一个选项几乎相同。
如果可以,请拒绝该任务(推荐)。
答案 2 :(得分:1)
你的问题并不完全清楚。使用身份转换是因为它提供了通过使用另一个更具体的模板来覆盖某些节点的机会。这可能是,因为身份转换是递归的。
如果你只想按原样复制所有内容,没有任何例外,你可以简单地使用:
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
这是否会提高性能是另一个问题。