考虑一个带有HL7v2消息的业务流程,然后将MSH / Body / ZSegments组合成一个HL7v2 XML模式。然后,通过业务流程中的Map运行此HL7v2 XML消息。为地图分配了一个自定义XSLT文件,而不是仅使用GUI映射器。最终映射的目标模式实际上只是一个通用模式,除了“any”元素之外什么都不包含。
尽管如此,XSLT实际上(应该是)映射到后来得到验证的CDA文档,所以此时我们还不想遵循架构(xslt实际上有一些逻辑依赖于它关于文件的类型)
这个映射是错误发生的地方,我调试了它,编排使它一直到变换,然后用
停止 在事件日志中 Document does not have a root element.
,当我在Visual Studio中使用“Test Map”命令运行地图时,会发生同样的错误,但是没有说明根节点丢失了什么...我觉得它必须与通用模式相关,因为“测试图”在我的测试XML实例中发现了一些错误(意味着它实际上正在读取输入)。
Test Map的输出文件只包含:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
猜猜是什么,没有根节点!
转换很好,并且在 XMLSpy 中以调试模式运行时。这一切都在BizTalk 2010 ... 我们刚刚将所有内容转换为BizTalk 2013 ,什么也没做,然后在Visual Studio 2012中打开项目(转换为BizTalk 2013格式) )并通过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
我也碰巧发现了这个:
The Mapper uses the XSLCompiledTransform class. Previous BizTalk Server versions used the XslTransform class, which is obsolete.
我猜是我问题的根源,但如果我知道如何解决这个问题该死的......
[更新]
我编写了一个快速应用程序,确认我们的XSLT使用XslTransform工作正常,但在使用XslCompiledTransform类时失败了Document does not have a root element.
。
任何人都有关于调试XslCompiledTransform的提示吗?
[UPDATE2] 在使用测试应用程序后,我发现它在XSL文件中都归结为这一行:
<xsl:strip-space elements="*"/>
我最终收到错误Whitespace cannot be stripped from documents that have already been loaded. Provide the input as an XmlReader instead
所以,我在我的测试应用程序中做了它所说的并且它有效!但是,我无法在BizTalk中这样做(或者不知道如何指定),因为我无法控制它。
还有办法在BizTalk中删除文档级别的空白吗?如果没有,则制表符和回车会使数据混乱并且文档验证失败。
答案 0 :(得分:1)
我知道这个问题已经过时了,但至少让我对你的上一个问题发表评论:
还有办法在BizTalk中删除文档级别的空白吗?如果没有,则制表符和回车会使数据混乱并且文档验证失败。
显然,Microsoft XML .NET工具堆栈不允许在文档加载时删除空白。这显然违反了XSLT标准,但还有什么是新的,所以我们不要去那里。但是,有一种相对简单的方法可以在不使用xsl:strip-space
的情况下在XSLT中去除空格。
剥离/标准化空间而不使用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>