Document在运行时期间在Custom xslt map中没有根元素,但在Debug中没有

时间:2013-11-28 17:48:41

标签: xml xslt map biztalk

考虑一个带有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

我也碰巧发现了这个:

What's new in BizTalk 2013

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中删除文档级别的空白吗?如果没有,则制表符和回车会使数据混乱并且文档验证失败。

1 个答案:

答案 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>