我有一个特殊的问题,我不知道如何解决。在办公室,我们有一个庞大而笨拙的 XSLT,用于将一种类型的 XML 适配到另一种类型。问题是它不是很一致地编写并且很难遵循。在这个样式表的古老创作中,似乎忘记了它的确切作用。
有没有办法以人类可读的格式轻松绘制出巨型 XSLT 的功能?即每个可能的输入 -> 每个可能的输出。我们无法创建一个包罗万象的输入文档,因为适配器对不同的输入有不同的行为(我们估计需要 100 多个输入文档才能覆盖所有可能的输出)
任何建议都将受到欢迎。
分解它——将 xsl 执行语句移动到文档内的 xsl 模板。通过这样做,您将自上而下地对文档有更合理的理解。
如果它是如此的巨大以至于让你无法理解它,这听起来就像你有一个重构决定摆在你面前:这个文档是否如此重要以至于我们需要知道它的作用(并了解它是如何工作的——因此需要一些返工),还是我们可以照原样接受它?
你了解你的输入文件吗?
如果是,则跳过下一句否则否:-
那么您无法测试任何由此产生的 XSLT 重构,因此您需要回答这个问题,是的。
你了解你的输出文件吗?
如果是,则跳过下一句否则否:-
那么您就无法测试任何由此产生的 XSLT 重构,因此您需要回答这个问题,是的。
既然这两个问题的答案都是肯定的,那么放弃 XSLT 并构建您可以理解的东西。你知道输入是什么,你知道你想要什么输出,经典的冯纽曼(他们现在还教这个吗?)。
通常这是不可能完成的任务——对于任何编程语言!
这是由于停止问题的不确定性。
因此,您可能会付出巨大的努力来尝试做一些被证明是不可能的事情。
我的建议 是编写自己的解决方案,遵循最佳编程实践,使用单元测试,如果可能的话使用正确性证明。XSLT 作为一种函数式语言更适合证明正确性。
这很可能不会对您有所帮助。但我会分享我的经验。
我只是在昨天才对 XSLT 进行自我治疗,当时我遇到了同样的问题,试图弄清楚 XSLT 规范在解析时所说的内容。为了帮助自己,我所做的是在原始 XSL 中添加了几个函数(xsl:template's,有点迂腐)。接下来,我通过浏览器运行它,瞧,我对 DFS 有了清晰的了解。
我创建了以下内容:
<xsl:template name="print">
<xsl:param name="message"/>
<xsl:param name="elem"/>
<div class="ArticleBody">
<br/>
<xsl:value-of select="$message"/>: <xsl:value-of select="$elem"/> ... <br/>
</div>
模板是工作人员,print
序言和尾声只是print
使用自定义字符串调用。
我将原始 XSL 文件从以下位置更改:
<xsl:template match="db:para">
<xsl:apply-templates/>
</xsl:template>
到:
<xsl:template match="db:para">
<xsl:call-template name="prologue">
<xsl:with-param name="item" select="'para'"/>
</xsl:call-template>
<xsl:apply-templates/>
<xsl:call-template name="epilogue">
<xsl:with-param name="item" select="'para'"/>
</xsl:call-template>
现在,当每个节点都被处理时,我会得到一个输出:
start-processing: article ...
当它完成时
end-processing: article ...
我也加入了一些 CSS(在处理根节点时),只是为了让事情看起来不错。这让我很开心:)