3

問題があります。次の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"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER>
</APIDATA>

SSISを使用する必要があります。すべてのOrderエントリのforeachループですべてのデータをSSIS変数に取得したいと思います。これまでのところ、SSISの制御フローでForeachLoopを使用してデータを取得できます。

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

ノードが存在しない場合でも常に何かを返すような方法でOtherInfoデータを取得するにはどうすればよいですか?たとえば、ノードが存在しない場合は、「いいえ」を返します。

ディスカッション側では、SSISマッピングが結果セットに整数インデックスを使用するため、これが必要です。結果セットの長さが4または5の場合、インデックスの範囲外エラーが発生します。これは、問題を回避し、常に固定長の結果セットを返すという私の考えです。

これができない場合、もう1つのアイデアは、デフォルト値で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でこれを解決するためのよりエレガントな方法はありますか?

4

1 に答える 1

7

ノードが存在しない場合でも常に何かを返すような方法でOtherInfoデータを取得するにはどうすればよいですか?たとえば、ノードが存在しない場合は、「いいえ」を返します。

OtherInfoこの属性が存在する場合は属性の値を生成し、"no"そうでない場合は文字列を生成する1つの方法を次に示します。

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

このXpath1.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)))

2つの文字列の連結を生成します。

コンテキストノードに。という名前の属性がある場合OtherInfo 2番目の文字列は空の文字列であり、最初の文字列(属性の値)のみが生成されます。

コンテキストノードにという名前の属性がない場合、OtherInfoの最初の引数concat()は空の文字列であり、2番目の引数が評価されて出力されます。

この部分式は、次の2つのケースのそれぞれでどのように評価されますか。

substring('no',1 + 2*boolean(@OtherInfo))
  1. @OtherInfo存在する場合。したがって2*boolean(@OtherInfo) = 2*true() = 2*1 = 2、式は次と同等です。長さが2しかないsubstring('no',3)ため、これは空の文字列です。"no"

  2. @OtherInfo存在しない場合。次に2*boolean(@OtherInfo) = 2*false() = 2*0 = 0。したがって、式は:と同等でsubstring('no',1)あり、これは文字列に評価されます"no"

于 2012-09-03T17:02:11.643 に答える