TIBCO XPath Tips

Identify Empty/Null value

使用判斷 $Start/xxx != '' 或使用 string-length($xxx/xxx)=0 會同時判斷 Empty String & Null (XML element does not exist) 的狀況

但如果是使用 $Start/xxx = '' 只會判斷 Empty,必需再加上 not(exists($Start/xxx)) 才會判斷 Null

Comment

{-- comment --}

starts-with

scenario: check if any value of “numberPrefix” element starts with a specific value

GetNumberList:

<root>
  <numberPrefix>...</numberPrefix>
  <numberPrefix>...</numberPrefix>
……
</root>
count($GetNumberList/root[numberPrefix[starts-with(., 'Valid Value')]]) > 0

Subtract Map

(取出不存在Result List的accountNumber)

$Start/root/accountInfo/accounts[not(accountNumber=$Result/accounts/accountNumber)]

sum

(計算dueDate<=前一天的amount總和)

sum($invoice/invoiceInfos/InvoiceInfo[dueDate[tib:compare-dateTime(.,tib:add-to-dateTime(current-dateTime(),0,0,-1,0,0,0))<=0]]/amount)

Extract Node without Namespaces

<xsl:value-of select="*:Envelope/*:Body/*:user/*:name"/>

Sort

在 for-each→點選Add Child→Statement Type: Sort→設定 Ordering, Data-Type…→Ok

Remove duplicate Data

Method 1: Using Grouping

http://tutorialspedia.com/tibco-for-each-group-tutorial-removing-duplicate-data/

Method 2: Sort→Using position(), 取第一筆及所有與前一筆不同的資料 (以此來去除重覆值)

$idx = position()
($idx=1) or (current()/XXX != $sort/...[$idx - 1]/XXX)

取出第一筆符合條件的資料

<root>
  <response>
    <services>
      <entity>Offer</entity>
      <attributes>
        <name>Type</name>
        <value>P</value>
      </attributes>
      <attributes>
        ......
      </attributes>
    </services>
    <services>
      ......
    </services>
  </response>
</root>
$root/response/services[.[entity='Offer']/attributes[name='Type']/value='P'][1]

tokenize

判斷是否符合條件

判斷 services.entity 是否為 Offer or Reward or Adjust
count($root/response/services[entity=tib:tokenize('Offer,Reward,Adjust',',')]) > 0

判斷是否為數字

string(number($root/response/services/count)) = 'NaN' → 非數字
not(number($root/response/services/count))

Process Definition load Error

BWENGINE-100052 Configuration error on input type for ...null
BWENGINE-100053 Configuration error on output type for ...null

Situation

  • Main Process→Sub Process,2個Process的Start/End使用同一個 Abstract WSDL
  • Validate Resource沒有問題
  • 單獨執行Sub Process可正常運作,一旦啟動 Main Process 就出現此錯誤
  • 此 WSDL 的 namespace 好像有與其他 WSDL 衝突

查不出原因,感覺是 namespace 的問題。因為有相同 namespace 導致TIBCO在找 WSDL時可能找到另一個WSDL,造成衝突無法 Mapping (我猜的…)

最後的解法是另外建立一個 Abstract WSDL,讓2個Process使用不同的WSDL

Data Validation Error

BWENGINE-100030 Input data invalid
BWENGINE-100031 Output data invalid

Data Type 不合,像是把Empty String放到 Number 欄位(非字串欄位)

在做 Mapping 時,如果將Optional欄位 mapping 到Mandatory欄位 (Null→Mandatory欄位)會出現Data Validation Error

有時Optional的”?”會不見 (TIBCO Designer Bug?)導致誤判為Mandatory,因此需刪除Mapping 再重拉一次,不然就是加上 if 判斷塞預設值

自動出現if…

在拉 mapping 時,Designer有時會自動加上 (if not(($…/@xsi:nil=(“true”)) or ($…/@xsi:nil=(“1″))))條件 →  有可能造成 Data Validation Error

原因是一邊宣告 nillable=”true” 另一邊沒有

解決方法為再將 Mapping 的 Value 複製到 “if” 的位置 (此時 “if” condition就會消失)

copy-contents-of 出現 namespace not defined

情況為使用SoapUI呼叫此Web Service可正常執行,但如果由TIBCO的其他Service呼叫就會出現namespace not defined的錯誤

不清楚原因

目前的解決方法為改用 for-each (在做 Mapping 時,如果Schema完全相同,會出現copy-contents-of的選項)

Reference

http://tibco-middleware.blogspot.tw

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s