使用从C#代码传递的XSLT中的参数

时间:2015-10-23 07:35:11

标签: c# .net sql-server xml xslt

我已经完成了将xml转换为另一个xml的任务,而多个SQL服务器表需要转换参数。

例如,输入XML有一个产品" XPOZER_90X120"。

XML:

<product exportName="XPOZER_90X120">
      <product-options>
        <option productOptionRef="xpozerFrame">
          <plan>
            <period startDate="2015-10-01">
              <price name="true" netBasePrice="34"/>
              <price name="false" netBasePrice="0"/>
            </period>
          </plan>
        </option>
      </product-options>
    </product>

此产品有一个选项&product; productOptionRef =&#34; xpozerFrame&#34;&#39;有两个子节点&#39;。一个节点有选项&#39; true&#39; netbaseprice 34和其他&#39; false&#39;与netbaseprice 0。 这将不得不转换为两个产品,一个没有框架,另一个有框架,两个产品的名称必须从数据库中的表生成。

xpozerFrame有两条记录,一条记录为false,另一条记录为true。 false有&#39; WISSEL _&#39; attachment和true附加一个空字符串。

xpozerFrame false WISSEL_

xpozerFrame true&#39;&#39;

然后是另一张表,其中一条记录的xpozerFrame将替换为上一张表中的值。

XPOZER_90X120 XPOZER_ [xpozerFrame] 90X120

因此,对于xpozerframe = true,由于空字符串,XPOZER_90X120保持不变。 对于xpozerframe = false,XPOZER_90X120变为XPOZER_WISSEL_90X120

生成的XML必须如下所示:

<products>
    <product exportName="XPOZER_WISSEL_90X120">
    </product>
    <product exportName="XPOZER_90X120">
    </product>
</products>

我希望到目前为止很清楚。 现在单独使用XSLT还不够,因为它无法从中读取数据库。所以我想我创建一个C#程序集,用于从Sql服务器中进行转换,同时还要读取表。

从这个链接我创建了转换代码:

http://blogs.msdn.com/b/mrorke/archive/2005/06/28/433471.aspx

public class XsltTransform
{
    public static SqlXml Transform(SqlXml inputDataXML, SqlXml inputTransformXML)
    {
        MemoryStream memoryXml = new System.IO.MemoryStream();
        XslCompiledTransform xslt = new XslCompiledTransform();
        XmlReader output = null;

        xslt.Load(inputTransformXML.CreateReader());

        // Output the newly constructed XML
        XmlTextWriter outputWriter = new XmlTextWriter(memoryXml, System.Text.Encoding.Default);
        xslt.Transform(inputDataXML.CreateReader(), null, outputWriter, null);
        memoryXml.Seek(0, System.IO.SeekOrigin.Begin);
        output = new XmlTextReader(memoryXml);

        return new SqlXml(output);
    }
}

然后在SQL server中执行此操作:

alter assembly XsltTransform
from 'c:\temp\XsltTransform.dll'

alter function ApplyXsltTransform( @inputXML xml, @inputTransform xml )
returns xml
as external name XsltTransform.XsltTransform.Transform

declare @xml  xml
declare @xslt xml

select @xml  = BulkColumn from openrowset( Bulk 'C:\temp\20349600_BE_main.xml', SINGLE_BLOB ) as x 
select @xslt = BulkColumn from openrowset( Bulk 'C:\temp\BE_main.xsl', SINGLE_BLOB ) as x 

select dbo.ApplyXsltTransform( @xml, @xslt )

这可以很好地转换,但我找不到的任何信息是如何将表值作为参数传递给XSLT代码以及如何在XSLT代码中使用它们。 Transform成员上有一个XsltArgumentlist参数:

xslt.Transform(inputDataXML.CreateReader(), /*XSLTArgumentList*/, outputWriter, null);

但是如何访问XSLT中的参数?

1 个答案:

答案 0 :(得分:2)

在XSLT模板中,添加如下节点:

<xsl:param name="param1" />

然后可以在XSLT中访问它,如下所示:

<xsl:value-of select="$param1" />

从C#传递出来,如此:

XsltArgumentList args = new XsltArgumentList();
args.Add("param1", null, "DataToPass");

在您的情况下,DataToPass实际上是您的SQL值。

相关问题