首页 文章

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

提问于
浏览
2

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

例如,输入XML具有产品“XPOZER_90X120” .

The 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>

该产品有一个选项'productOptionRef =“xpozerFrame”',带有两个子节点'' . 一个节点的netbaseprice为34,另一个'false',netbaseprice为0.这必须转换为两个产品,一个没有框架,另一个有框架,必须生成两个产品的名称来自数据库中的表 .

xpozerFrame有两条记录,一条记录为false,另一条记录为true . false附加了'WISSEL_',并且true附加了一个空字符串 .

xpozerFrame false WISSEL_

xpozerFrame true''

然后是另一个表,其中一个记录的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服务器中执行此操作:

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 回答

  • 2

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

    <xsl:param name="param1" />
    

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

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

    并从C#传递如下:

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

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

相关问题