2009-02-24 105 views
2

我有一个特定的问题,我不知道如何处理。这里在办公室里有这么大的笨重的XSLT,我们用它来调整一种类型的XML到另一种。问题在于它不是一贯地书写而且很难遵循。在这个样式表的古老创作中,似乎它被完全遗忘了。XSLT映射算法

有没有一种方法能够以一种人类可读的格式轻松映射出巨型XSLT的功能?即每个可能的输入 - >每个可能的输出。由于适配器针对不同的输入具有不同的行为(我们估计需要100多个输入文档来覆盖每个可能的输出),所以我们无法创建全面的输入文档。

任何建议都会受到欢迎。

+0

不是。 XSLT本质上是递归的。 – annakata 2009-02-24 15:45:41

+0

没有乐趣。我想我们真的很想知道:“是否有一种简单的方法可以绘制出一个巨大样式表的所有模板调用?” XSLT不适合这一点。 – 2009-02-24 15:51:43

回答

1

分手 - 将xsl执行语句移动到文档中的xsl模板。通过这样做,您可以从上到下更合理地理解文档。

如果它太令人难以置信地巨大以至于无法理解它,这听起来像是你有一个重新决定你的决定:这个文件是如此重要以至于我们需要知道它的作用(并理解它是如何工作 - 因此需要一些重新工作),或者我们可以像现在一样生活吗?

0

这不会帮助你。但我会分享我的经验。

我只是在昨天才对待XSLT,当时我遇到同样的问题,试图弄清楚XSLT规范是怎么说w.r.t.解析。我做了什么,为了帮助自己,我在原来的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: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> 

我现在得到一个输出时,每一个节点进行处理:

而且我把从改变原来的XSL文件

start-processing: article ... 

and it when co mpleted

end-processing: article ... 

我有点CSS的投掷以及(处理根节点时),只是让事情看起来不错。而那种让我的一天:)

1

你了解你的输入文件吗?

如果是跳到下一句别的号: -

然后你就不能测试XSLT的任何形成的再因素,因此,你需要使这个问题的答案,是的。

你了解你的输出文件吗?

如果是跳到下一句别的号: -

,那么你不能测试XSLT的任何形成的再因素,因此您需要回答这个quesion,是的。

既然这两个问题的答案都是“是”,那么请关闭XSLT并构建一些可以理解的内容。你知道输入是什么,你知道你想要什么输出,经典的von-newman(他们现在还在教这个吗?)。

+0

我必须同意,我希望这个适配器的设计者能共享更好的文档。 – 2009-02-24 15:58:50

1

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

这从the halting problem的不可判定性得出。

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

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