使用带有SSIS的xslt动态过滤xml子元素

时间:2017-07-13 13:42:49

标签: sql-server xslt filter ssis etl

我有一个来自ICECAT的大型xml文件。我只想要一些信息。这是本主题的以下内容how transform xml document with xslt to duplicate output lines according to the child node

我在数据库中有一张语言表。我希望使用xslt过滤器子元素<Name>,具体取决于我的表内容。

我在SSIS项目中。

1 个答案:

答案 0 :(得分:1)

1 /我创建一个名为Filter的变量和一个Foreach ADO枚举器,将enuration放入变量IdLang

2 /使用带有此表达式的表达式任务:     @[User::Filter]=( LEN( @[User::Filter] ) ==0 ? "@langid=" + (DT_WSTR, 2) @[User::IdLang] : @[User::Filter] + " or @langid=" + (DT_WSTR, 2)@[User::IdLang] )

3 /在旧主题中,我有一个xslt文件,我把它放在一个名为“xslt”的变量中:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output  method="xml" encoding="UTF-8" indent="yes"/>  <xsl:template match="/ICECAT-interface">     <xsl:apply-templates select="Response"/> </xsl:template>  <xsl:template match="Response">     <xsl:apply-templates select="SuppliersList"/> </xsl:template>  <xsl:template match="SuppliersList">   <xsl:copy>     <xsl:apply-templates select="Supplier"/>   </xsl:copy> </xsl:template>  <xsl:template match="Supplier">     <Supplier>       <xsl:copy-of select="@ID|@LogoLowPic|@Name"/>       <xsl:attribute name="langid">           <xsl:value-of select="1"/>       </xsl:attribute>   </Supplier>   <xsl:apply-templates select="Names/Name"/> </xsl:template>  <xsl:template match="Name[###]">   <Supplier>     <xsl:copy-of select="../../@ID|../../@LogoLowPic|@langid|@Name" /> </Supplier>  </xsl:template> </xsl:stylesheet>

4 /最后我使用脚本任务

Dim filtr As String = Dts.Variables("User::Filter").Value 

        Dim Schem = Dts.Variables("User::Xslt").Value.ToString.Replace("###", filtr)
        Dim xslt As New XslCompiledTransform()
        xslt.Load(New XmlTextReader(New IO.StringReader(Schem)))
         Dim settings As New Xml.XmlReaderSettings()
        settings.DtdProcessing = Xml.DtdProcessing.Parse
        Dim SourcePath As String = ???
        Dim source As Xml.XmlReader = Xml.XmlReader.Create(SourcePath, settings)

        Dim DestinationPath As String = ???
        Dim Destination As Xml.XmlWriter = Xml.XmlWriter.Create(DestinationPath)

        xslt.Transform(source, Destination)

我希望它可以帮助某人。