2012-09-03 36 views
3

我有一個問題,請考慮以下XML:如果在XPATH中不存在節點,如何返回常量?

<?xml version="1.0" encoding="UTF-16"?> 
<APIDATA xmlns="api-com"> 
<ORDER EngineID="1" OrderID="66" OtherInfo="yes"><INSTSPECIFIER InstID="27" SeqID="17"/>  
</ORDER> 
<ORDER EngineID="2" OrderID="67" OtherInfo="yes"><INSTSPECIFIER InstID="28" SeqID="18"/>  
</ORDER> 
<ORDER EngineID="3" OrderID="68"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER> 
</APIDATA> 

我有SSIS工作。我希望將所有數據都傳遞給所有Order條目的每個循環中的SSIS變量。到目前爲止,我可以在SSIS控制流程的foreach循環得到的數據,用下面的:

EnumerationType: ElementCollection 
OuterXPathString: //*[name() = 'ORDER'] 
InnerElementType: NodeText 
InnerXPathString: @*[name() = 'EngineID'] | @*[name() = 'OrderID'] | child::node()/@*[name() = 'InstID'] | child::node()/@*[name() = 'SeqID'] 

我怎樣才能獲得活動促銷數據以這樣一種方式,它總是給後面的東西,即使節點不存在?例如,如果該節點不存在,則返回「否」。

在討論方面,我需要這個,因爲SSIS映射對結果集使用整數索引。如果結果集長度可能是4或5,我會得到索引超出界限的錯誤。這是我的想法來規避問題,總是返回一個固定長度的結果集。

如果這不能完成,另一個想法是用默認值擴展XML。所以如果另一個問題是:你能告訴我,如何將默認值添加到XPATH的XML?示例:使XML提到這個:

<?xml version="1.0" encoding="UTF-16"?> 
<APIDATA xmlns="api-com"> 
<ORDER EngineID="1" OrderID="66" OtherInfo="yes"><INSTSPECIFIER InstID="27" SeqID="17"/>  
</ORDER> 
<ORDER EngineID="2" OrderID="67" OtherInfo="yes"><INSTSPECIFIER InstID="28" SeqID="18"/>  
</ORDER> 
<ORDER EngineID="3" OrderID="68" OtherInfo="defaultvalue"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER> 
</APIDATA> 

或者有沒有在SSIS解決這個更優雅的方式?

回答

7

我怎麼能得到這樣的活動促銷數據,它將始終 回饋一些東西,即使節點不存在?例如,如果 節點不存在,則返回「否」。

這裏是產生此屬性是否存在OtherInfo屬性或串"no"的值否則單程:

 concat(@OtherInfo, 
      substring('no',1 + 2*boolean(@OtherInfo))) 

當這個XPath 1。以下元件上0表達式進行求值:

<ORDER EngineID="1" OrderID="66" OtherInfo="yes"> 
      <INSTSPECIFIER InstID="27" SeqID="17"/> 

結果是:

yes 

但是,當相同的表達被進行評價:

<ORDER EngineID="3" OrderID="68"> 
      <INSTSPECIFIER InstID="29" SeqID="19"/> 

那麼結果是:

no 

基於XSLT的驗證

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*/*"> 
     <xsl:value-of select= 
     "concat(@OtherInfo, 
       substring('no',1 + 2*boolean(@OtherInfo))) 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<APIDATA xmlns="api-com"> 
     <ORDER EngineID="1" OrderID="66" OtherInfo="yes"> 
       <INSTSPECIFIER InstID="27" SeqID="17"/> 
     </ORDER> 
     <ORDER EngineID="2" OrderID="67" OtherInfo="yes"> 
       <INSTSPECIFIER InstID="28" SeqID="18"/> 
     </ORDER> 
     <ORDER EngineID="3" OrderID="68"> 
       <INSTSPECIFIER InstID="29" SeqID="19"/> 
     </ORDER> 
</APIDATA> 

XPath表達式是針對每個ORDER元件和結果評價的評價被複制到輸出

yesyesno 

說明

表達:

 concat(@OtherInfo, 
      substring('no',1 + 2*boolean(@OtherInfo))) 

產生兩個字符串的連接。

如果上下文節點具有名爲OtherInfo,的屬性,則第二個字符串是空字符串,並且只生成第一個字符串(屬性的值)。

如果上下文節點沒有名爲OtherInfo屬性,那麼concat()的第一個參數是空字符串,第二個參數被評估和輸出。

這是如何子表達式中的每個這兩種情況計算:

substring('no',1 + 2*boolean(@OtherInfo)) 
  1. 如果@OtherInfo存在。然後2*boolean(@OtherInfo) = 2*true() = 2*1 = 2因此,表達式是等效於:substring('no',3),這是空字符串,因爲"no"具有僅2.

  2. 如果@OtherInfo的長度不存在。然後2*boolean(@OtherInfo) = 2*false() = 2*0 = 0。因此,該表達式相當於:substring('no',1)並且這將計算爲字符串"no"

相關問題