Я пытаюсь применить преобразование XSL к XML-файлу в XML-задаче пакета SSIS.Использование/реализация функции exsl node-set() в XML-задаче SSIS
Все хорошо и хорошо, но, к сожалению, мой 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 в пакете я получаю следующее исключение:
Error: 0xC002F304 at XML Task, XML Task: An error occurred with the following error message: "Function 'msxsl:node-set()' has failed.".
Я использую VS2005 для разработки пакета, как это версия SSIS 2005.
Любые идеи о том, как я могу продолжить, очень ценятся.
Я вызываю шаблон, который реализует функцию EXSLT str: split для «tokenise» строки в ее составные элементы, например. «Кермит T Frog» будет возвращено следующим образом:
<token>Kermit</token>
<token>T</token>
<token>Frog</token>
Это хранится в переменной $ familyNames, которые я потом перебирать. Однако, поскольку это возвращается как фрагмент дерева результатов, мне нужно обернуть его с помощью функции msxsl: node-set(), чтобы результат обрабатывался как набор узлов. Не знаю, как еще я могу достичь вышеизложенного.
Вот реализация ул: расколоть, что я получил от http://www.exslt.org/:
<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>
Откуда берутся $ familyNames? Можете ли вы разместить часть своего XSLT, которая ее создает? Возможно, есть способ избежать набора узлов() вообще. – Tomalak
Отредактированный вопрос для дальнейшей разработки проблемы по запросу. – pFrenchie