考虑一个业务流程,它接收一条hl7v2消息,然后将msh/body/zsegments组合成一个hl7v2 xml模式。然后,该HL7v2 XML消息通过业务流程中的映射运行。这个映射被分配了一个定制的xslt文件,而不是仅仅使用gui映射器。最终映射的目标模式实际上只是一个泛型模式,它只包含一个“any”元素。
尽管如此,xslt实际上(应该)映射到一个cda文档,该文档稍后会得到验证,因此在这一点上,我们还不想遵循模式(xslt实际上包含一些逻辑,具体取决于文档的类型)
这个映射是错误发生的地方,我已经调试了它,编排使它一直到转换,然后用Document does not have a root element.
在事件日志中,以及当我在visual studio中使用“test map”命令运行映射时,也会出现同样的错误,但并没有说明根节点缺少了什么…我感觉它一定与泛型架构有关,因为“测试映射”在我的测试xml实例中发现了一些错误(意味着它实际上正在读取输入)。
测试映射的输出文件仅包含:<?xml version="1.0" encoding="utf-8" standalone="yes"?>
猜猜看,没有根节点!
在xmlspy中以调试模式运行时,转换发生得很好。所有这些都在biztalk 2010中工作…我们只是将所有内容转换为biztalk 2013,然后在visual studio 2012中打开项目(转换为biztalk2013格式),并通过visual studio部署到bts。未更改任何代码,全部编译正常,项目转换中没有错误或警告。
我的问题是,发生了什么变化?.net是否改变了它在4.5中处理xslt/schema的方式?biztalk 2013在这方面是否做了任何更改?
编辑更多信息
我决定在visual studio 2012中尝试“调试映射”(测试映射不起作用)。而且转换过程顺利进行…测试图仍然失败。在“调试映射”期间,输出窗口中只有一点信息,我注意到它正在从Microsoft.NET GAC加载system.xml:C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll
我也碰巧发现了这个:
What's new in BizTalk 2013The Mapper uses the XSLCompiledTransform class. Previous BizTalk Server versions used the XslTransform class, which is obsolete.
我想这是我问题的根源,但如果我知道如何解决…
[更新]
我编写了一个快速应用程序,它确认我们的xslt在使用xsltransform时可以正常工作,但是在使用xslcompiledtransform类时失败了。
有人对调试xslcompiledtransform有什么建议吗?
[UpDATE2]
在研究了测试应用程序之后,我发现这一切都归结为xsl文件中的这一行:Document does not have a root element.
我最终得到了错误<xsl:strip-space elements="*"/>
所以,我做了它所说的,在我的测试应用程序和它的工作!但是,我不能在biztalk中这样做(或者不知道如何指定),因为我无法控制它。
在biztalk中,是否仍有方法在文档级别除去空白?否则,制表符和回车将弄乱数据,并且文档验证失败。
最佳答案
我知道这个问题已经过时了,但至少让我谈谈你的最后一个问题:
在biztalk中,是否仍有方法在文档级别除去空白?否则,制表符和回车将弄乱数据,并且文档验证失败。
显然,当文档已经加载时,Microsoft XML.NET工具堆栈不允许删除空白。这显然违反了xslt标准,但还有什么新的东西,所以我们不要去那里。但是,有一种相对简单的方法可以在xslt中去掉空白,而不使用xsl:strip-space
。
不带xsl:strip space的剥离/规范化空间:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="urn:schemas-microsoft-com:xslt"
version="1.0">
<xsl:template match="/">
<xsl:variable name="stripped">
<xsl:apply-templates select="/" mode="strip-whitespace" />
</xsl:variable>
<!-- micro-pipeline of input document, now without redundant whitespace -->
<xsl:apply-templates select="ext:node-set($stripped)/*" />
</xsl:template>
<xsl:template match="/root">
<!-- start your regular processing here in the default mode -->
<xsl:apply-templates />
</xsl:template>
<!-- copy idiom, copies any input nodes unchanged -->
<xsl:template match="node() | attribute::node()" mode="strip-whitespace">
<xsl:copy>
<xsl:apply-templates select="node() | attribute::node()" mode="strip-whitespace" />
</xsl:copy>
</xsl:template>
<!-- normalize space on text-nodes. Chagne this appropriately
if you only want to remove trailing/leading whitespace -->
<xsl:template match="text()" mode="strip-whitespace">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
</xsl:stylesheet>