我已经完成了将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中的参数?
答案 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值。