gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:40:56 25 4
gpt4 key购买 nike

考虑一个编排,它接收一条 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com