我最近讨论过是否使用XSLT或代码将映射功能从一种XML格式写入另一种XML格式,或者甚至在转换为XML以外的其他格式时。现在我的心态是,XSLT的目的正是针对这类事情,并且是最合适的选择。
但是,其他人建议在需要更复杂的东西时不合适,例如当您需要从外部存储库查找数据时。他们还建议XSLT可以像编写代码一样复杂,因此否定了这个论点。通过利用TDD和CI实践,使用代码解决方案可以更轻松地进行测试。
此讨论的基础是设计一个公共转换服务,当需要任何映射时,WCF服务应该使用该服务。例如,将传入消息转换为规范形式时。我认为最好编写此服务以针对XSLT映射执行XML消息的某些匹配。然后,您可以轻松地放入/取出这些映射而无需重新编译代码,并且可以更轻松地获取这些映射并了解代码外部的情况。
我想知道你们有什么想法,是否有人有任何类似的经历?我知道我可以出去买一个产品,但宁愿听到定制的解决方案。
由于
答案 0 :(得分:4)
首先,为了清楚起见,XSLT 是代码。 ;)它是图灵完整的函数式编程语言。
当输入和输出是XML时,我通常更喜欢XSLT;在使用通用语言进行转换时,涉及很多锅炉板代码。例外情况是输入需要由于其大小而需要按顺序处理(XSLT需要输入和输出的完整内存树结构)。另外,发射例如通过XSLT的纯文本很痛苦(主要是由于空格/换行问题)。
但是,一个有效的问题是,团队中是否通常可以使用读取和维护XSLT程序的技能。如果人们不习惯功能范例,学习XSLT可能具有挑战性(即不会在项目/公司时间发生),并且解决方案通常必须立即可供项目上的其他开发人员/维护人员阅读。在那种情况下,我(勉强地)去寻找通用语言解决方案。
XSLT也不会阻止单元测试;可以通过断言转换测试用例的输出来测试转换。
答案 1 :(得分:3)
我们编写了一个事件驱动的数据库集成系统,它广泛使用XSLT来转换XML消息。有用于执行XSLT转换的单元测试的框架,我们还发现能够使用TeXSLMate调色板直接在TextMate中转换消息,而无需重新编译任何内容。
我认为使用XSLT的优势在于它是一种可以在许多环境中使用的通用技术 - 例如我们也将它用作Web应用程序的模板系统 - 并且存在很好的工具。
答案 2 :(得分:2)
我同意你的观点 - XSLT旨在从一种XML格式映射到另一种格式,如果你需要从一种格式映射到另一种格式,那就是最佳选择。
当你不得不走另一条道路时,事情的定义要少一些 - 几种不同的格式需要转换为一个非常规的格式......我已经看到尝试在一组XSL文件中完成所有操作,阅读或理解它太可怕了。我会在每次转换时使用单个XSLT。
XSLT vs Code的一个问题是,使用XSLT,你需要在内存中使用整个XML和XSL文件进行转换,所以如果你有大文件(megs及以上的hunderds),这可能不是最佳的前进方式。 / p>
答案 3 :(得分:1)
其他答案涵盖了使用XSLT的原因;我想解决有关数据库查找的问题。
数据库查找实际上超出了转换范围。也就是说,您不再将一种XML格式转换为另一种格式;您包含来自外部来源的信息,这些信息不属于您的输入。 (我假设您的数据库足够大和/或易变,因此无法通过document
函数读取转换的XML文档来表示,这是最简单的方法。 )
根据我的经验,这最好通过预处理源XML来完成,通过一个进程运行它,然后使用数据库中的附加信息对其进行修饰,然后再将其传递给转换。
还可以值得预处理源XML来处理XSLT无法正常处理的情况。例如,如果XML包含由于某种原因尚未解析为可用的XML形式的字符串数据,则可能值得在预处理器中解析数据并在将XML传递给转换之前更新XML。一个很好的例子是源格式是由认为日期应该表示为MM/DD/YYYY
或布尔值为Y
和N
的人设计的。当然,您可以在XSLT中解决这个问题,但是如果您按下输入以将值转换为规范表示形式,然后再将其转换为XSLT,则通常会简化操作。