SSISパッケージXMLタスク内のXMLファイルにXSL変換を適用しようとしています。
すべて順調ですが、残念ながら、関数を使用する必要があるため、XSLは通常よりもわずかに「ポータブル」ではありませんnode-set()
。私のXSLの簡単な例は次のとおりです。
<xsl:for-each select="msxsl:node-set($familyNames)/token">
<xsl:call-template name="PersonNameComponent">
<xsl:with-param name="nameComponentType" select="'S'" />
<xsl:with-param name="nameComponentSeqNo" select="number($noOfGivenNames) + position()" />
<xsl:with-param name="nameComponent" select="." />
<xsl:with-param name="nameTypeName" select="$familyName" />
<xsl:with-param name="roleCode" select="$roleCode" />
</xsl:call-template>
</xsl:for-each>
スタイルシート宣言で次の名前空間を使用しています。
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
これは、VS IDE、XMLSpy(XSLTエンジンをMSXMLとして設定している限り)などで機能します。ただし、パッケージ内でXMLタスクを実行しようとすると、次の例外が発生します。
エラー:0xC002F304 at XMLタスク、XMLタスク:次のエラーメッセージでエラーが発生しました:「関数'msxsl:node-set()'が失敗しました。」
2005バージョンのSSISであるため、パッケージの設計にVS2005を使用しています。
私がどのように進めることができるかについてのどんな考えも大いに感謝されます。
EXSLT str:split関数を実装するテンプレートを呼び出して、文字列をその構成要素に「トークン化」します。たとえば、「KermitTFrog」は次のように返されます。
<token>Kermit</token>
<token>T</token>
<token>Frog</token>
これは変数$familyNamesに格納され、それを繰り返し処理します。ただし、これは結果ツリーフラグメントとして返されるため、結果がノードセットとして扱われるように、関数msxsl:node-set()でラップする必要があります。上記を他にどのように達成できるかわかりません。
これが私がhttp://www.exslt.org/から入手したstr:splitの実装です:
<xsl:template name="str:split">
<xsl:param name="string" select="''" />
<xsl:param name="pattern" select="' '" />
<xsl:choose>
<xsl:when test="not($string)" />
<xsl:when test="not($pattern)">
<xsl:call-template name="str:_split-characters">
<xsl:with-param name="string" select="$string" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="str:_split-pattern">
<xsl:with-param name="string" select="$string" />
<xsl:with-param name="pattern" select="$pattern" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="str:_split-characters">
<xsl:param name="string" />
<xsl:if test="$string">
<token><xsl:value-of select="substring($string, 1, 1)" /></token>
<xsl:call-template name="str:_split-characters">
<xsl:with-param name="string" select="substring($string, 2)" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="str:_split-pattern">
<xsl:param name="string" />
<xsl:param name="pattern" />
<xsl:choose>
<xsl:when test="contains($string, $pattern)">
<xsl:if test="not(starts-with($string, $pattern))">
<token><xsl:value-of select="substring-before($string, $pattern)" /></token>
</xsl:if>
<xsl:call-template name="str:_split-pattern">
<xsl:with-param name="string" select="substring-after($string, $pattern)" />
<xsl:with-param name="pattern" select="$pattern" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<token><xsl:value-of select="$string" /></token>
</xsl:otherwise>
</xsl:choose>
</xsl:template>