jjzjj

xml - 文档在运行时在自定义 xslt 映射中没有根元素,但在调试中没有

coder 2024-07-02 原文

考虑一个编排,它接收一条 HL7v2 消息,然后将 MSH/Body/ZSegments 组合成一个 HL7v2 XML 模式。然后,此 HL7v2 XML 消息通过编排中的 Map 运行。该 map 被分配了一个自定义的 XSLT 文件,而不是仅仅使用 GUI 映射器。最终映射的目标模式实际上只是一个通用模式,只包含一个“任何”元素。

尽管如此,XSLT 实际上(应该是)映射到稍后得到验证的 CDA 文档,所以此时我们还不想遵循模式(xslt 实际上有一些逻辑取决于它关于文档类型)

这个映射是错误发生的地方,我已经调试它并且编排一直到转换,然后停止

Document does not have a root element.在事件日志中,以及当我在 Visual Studio 中使用“Test Map”命令运行 map 时,发生了同样的错误,但没有说明根节点丢失了什么......我觉得它一定是相关的到通用模式,因为“测试映射”在我的测试 XML 实例中发现了一些错误(意味着它实际上正在读取输入)。

测试 map 的输出文件仅包含:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>猜猜看,没有根节点!

当在 XMLSpy 中以 Debug模式运行时,转换发生得很好。这一切都在 BizTalk 2010 中工作...我们只是将所有内容都转换为 BizTalk 2013,什么也没做,然后在 Visual Studio 2012 中打开项目(转换为 BizTalk 2013 格式) 并通过 Visual Studio 部署到 BTS。没有更改代码,编译一切正常,项目转换中没有错误或警告。

我的问题是,发生了什么变化? .Net 是否改变了它在 4.5 中处理 XSLT/Schema 的方式? BizTalk 2013在这方面有什么改变吗?

编辑更多信息 我决定在 Visual Studio 2012 中尝试“调试 map ”(其中测试 map 不起作用)。并且转换顺利进行......测试 map 仍然失败。唯一的其他信息是在“调试映射”期间的输出窗口中,我注意到它正在从 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 工作正常,但失败并返回 Document does not have a root element.使用 XslCompiledTransform 类时。

有人有关于调试 XslCompiledTransform 的提示吗?

[更新2] 在研究了测试应用程序之后,我发现一切都归结为 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 中去除文档级别的空白?否则,制表符和回车符会弄乱数据,文档无法通过验证。

最佳答案

我知道这个问题很老了,但至少让我对你的最后一个问题发表评论:

Is there still a way to strip the whitespace at a document level in BizTalk? If not, the tabs and carriage returns mess up the data and documents fail validation.

显然,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>

关于xml - 文档在运行时在自定义 xslt 映射中没有根元素,但在调试中没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20272138/

有关xml - 文档在运行时在自定义 xslt 映射中没有根元素,但在调试中没有的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  10. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

随机推荐