我已经完成了将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 回答
在您的XSLT模板中,添加如下节点:
然后可以在XSLT中访问它,如下所示:
并从C#传递如下:
在您的情况下,DataToPass实际上是您的SQL值 .