2010-01-26 104 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