NoticeType\tApplication
Detail Invoice\t1
Detail Invoice\t2
Detail Invoice\t3
我正在使用的样式表:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no" />
<xsl:template match="/DetailBill">
<xsl:text>NoticeType	Application
</xsl:text>
<xsl:for-each select="DetailBillInfo">
<xsl:value-of select="normalize-space(NoticeType)" />
<xsl:text>	</xsl:text>
<xsl:value-of select="normalize-space(Application)" />
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我用Saxoncs 12.4在.NET 8.0中调用转换:
System.Xml.Linq.XElement xml = System.Xml.Linq.XElement.Parse("{xml}");
System.Xml.Linq.XElement stylesheet = System.Xml.Linq.XElement.Parse("{xslt}");
Saxon.Api.Processor processor = new(true);
Saxon.Api.XsltCompiler comp = processor.NewXsltCompiler();
List<Saxon.Api.Error> errs = [];
comp.ErrorReporter = errs.Add;
Saxon.Api.XsltExecutable exe = comp.Compile(stylesheet.CreateReader());
Saxon.Api.Xslt30Transformer xfrm = exe.Load30();
Saxon.Api.XdmValue output = xfrm.ApplyTemplates(xml.CreateReader());
但是,我看起来像这样的输出:
NoticeType Application
Detail Invoice
\t
1
Detail Invoice
\t
2
Detail Invoice
\t
3
有人能告诉我我在做什么错吗?
update: Martin Honnen的建议,我尝试使用Saxon.Api.Serializer
,这给出了预期的产出。这是一个更新的C#代码样本:
System.Xml.Linq.XElement xml = System.Xml.Linq.XElement.Parse("{xml}");
System.Xml.Linq.XElement stylesheet = System.Xml.Linq.XElement.Parse("{xslt}");
Saxon.Api.Processor processor = new(true);
Saxon.Api.XsltCompiler comp = processor.NewXsltCompiler();
List<Saxon.Api.Error> errs = [];
comp.ErrorReporter = errs.Add;
Saxon.Api.XsltExecutable exe = comp.Compile(stylesheet.CreateReader());
Saxon.Api.Xslt30Transformer xfrm = exe.Load30();
Saxon.Api.Serializer ser = processor.NewSerializer();
System.Text.StringBuilder sb = new();
using System.IO.StringWriter sw = new(sb);
ser.OutputWriter = sw;
xfrm.ApplyTemplates(xml.CreateReader(), ser);
运行sb
的一开始包含预期输出。我对撒克逊人没有足够深的了解,无法理解为什么使用
Serializer
与Just
output.ToSting()
有所作为。我很高兴能使它起作用。
如果您希望撒克逊人控制序列化的文本输出,包括基于您的<xsl:output method="text" indent="no" />
和XSLT代码的序列化,那么我建议不要因为
ApplyTemplates
的结果不使用XDMValue,而是通过a
Serializer
(例如。 a
StringWriter
或流)作为第二个论点。
ApplyTemplates
,我认为您将想要的输出作为字符串获得,或者,撒克逊人当然只写入文件(流),如果您提供流到
ToString()
.。