2

我有一个特殊的问题,我不知道如何解决。在办公室,我们有一个庞大而笨拙的 XSLT,用于将一种类型的 XML 适配到另一种类型。问题是它不是很一致地编写并且很难遵循。在这个样式表的古老创作中,似乎忘记了它的确切作用。

有没有办法以人类可读的格式轻松绘制出巨型 XSLT 的功能?即每个可能的输入 -> 每个可能的输出。我们无法创建一个包罗万象的输入文档,因为适配器对不同的输入有不同的行为(我们估计需要 100 多个输入文档才能覆盖所有可能的输出)

任何建议都将受到欢迎。

4

4 回答 4

1

分解它——将 xsl 执行语句移动到文档内的 xsl 模板。通过这样做,您将自上而下地对文档有更合理的理解。

如果它是如此的巨大以至于让你无法理解它,这听起来就像你有一个重构决定摆在你面前:这个文档是否如此重要以至于我们需要知道它的作用(并了解它是如何工作的——因此需要一些返工),还是我们可以照原样接受它?

于 2009-02-24T15:49:47.620 回答
1

你了解你的输入文件吗?

如果是,则跳过下一句否则否:-

那么您无法测试任何由此产生的 XSLT 重构,因此您需要回答这个问题,是的。

你了解你的输出文件吗?

如果是,则跳过下一句否则否:-

那么您就无法测试任何由此产生的 XSLT 重构,因此您需要回答这个问题,是的。

既然这两个问题的答案都是肯定的,那么放弃 XSLT 并构建您可以理解的东西。你知道输入是什么,你知道你想要什么输出,经典的冯纽曼(他们现在还教这个吗?)。

于 2009-02-24T15:49:50.037 回答
1

通常这是不可能完成的任务——对于任何编程语言!

这是由于停止问题的不确定性。

因此,您可能会付出巨大的努力来尝试做一些被证明是不可能的事情。

我的建议 是编写自己的解决方案,遵循最佳编程实践,使用单元测试,如果可能的话使用正确性证明。XSLT 作为一种函数式语言更适合证明正确性。

于 2009-02-24T17:22:05.930 回答
0

这很可能不会对您有所帮助。但我会分享我的经验。

我只是在昨天才对 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(在处理根节点时),只是为了让事情看起来不错。这让我很开心:)

于 2009-02-24T15:49:27.403 回答