2010-01-26 58 views
1

我有一种情况,我的BizTalk地图不能正确地从输入XML中提取数据。BizTalk Map错误地解析输入XML

的输入模式是这样的:

序列

A 

    B 

所有3上的XSD那些节点的具有最小0,最大无界的。

所以这里有一个样本输入文件片段:

<A>1</A> 
<B>hi</B> 
<A>2</A> 
<B>there</B> 

现在我的地图需要这些数据,并调用存储的特效将数据插入到表中。对于A的A和A的2,我得到B字段的“hi”。这是不正确的。

我将问题追溯到地图。所产生的XSLT在A上做了一个foreach,然后去抓取值B,但总是抓住第一个B.因此,任何人都有任何提示修改输入模式或映射以使其正常工作?

+0

我知道这个问题是旧的,但你的模式被渲染为“A B”。你能修好吗?另外,添加你的解决方案(如果你有一个)。 – 13ren 2010-06-01 07:41:26

+0

从描述中可以看出元素A和元素B都具有min/max {0,unbounded},并且包含在一个序列元素中,该元素也具有min/max {0,unbounded}。作为回答,我认为你可以为这三部分中的每一部分添加一个显式循环functoid。或者,如果你总是有AB对(就像在你的例子中那样),你可以将A和B设置为{1,1},并且只在外部有一个循环(假设它们总是成对出现)。 – 13ren 2010-06-01 07:42:50

回答

2

如果需要A,B组项目一呆,你可以改变模式是创建一个包装元素,让您的架构看起来像:

<xs:element name="wrapper"> 
    <xs:complextype> 
    <xs:sequence> 
     <xsl:element name="A" type="xs:string" minoccur="1" maxoccur="1"/> 
     <xsl:element name="B" type="xs:string" minoccur="1" maxoccur="1" /> 
    </xs:sequence> 
    </xs:complextype> 
</xs:element> 

,那么你可以通过包装元素循环,并获得A和B元素。但我不确定这是你想要的。

另一种选择是在XSLT调用模板中工作。使用A和A的当前迭代,那么当你得到B时,你实际上是B [i],其中i是当前迭代。

+0

很棒的建议。我会试试看。我只是想知道我是否需要'包装'一个。序列元素不是作为包装?在BizTalk中,我可以在该级别指定min 0,max unbounded,然后在A和B中min 1 max 1。我给它一个快速尝试,它完全改变了我的变换的输出。 – Krip 2010-01-27 10:09:27

+0

这确实是一个很好的建议,你至少可以改变他或接受答案。已经有太多的人已经只是回答问题并运行。 – xcut 2010-01-27 15:29:24

+0

不要担心xcut,我不会逃跑。我一定会在信贷到期时给予贷款。我仍然试图在BizTalk上下文中解决这个问题,这是我“改变他”的标准。我无法添加包装器并使用修订后的模式正确解析输入文件,更不用说运行映射后进行转换。这是因为如果我添加一个包装元素,我必须指出我正在寻找什么'文本',它是如何分隔的等等,所以此刻这是一个很好的想法,它不适合我。 -Krip – Krip 2010-01-28 10:31:11