问题描述 投票:0回答:1
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&#x9;Application&#xA;</xsl:text>
    <xsl:for-each select="DetailBillInfo">
      <xsl:value-of select="normalize-space(NoticeType)" />
      <xsl:text>&#x9;</xsl:text>
      <xsl:value-of select="normalize-space(Application)" />
      <xsl:text>&#xA;</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

或流)作为第二个论点。
c# xslt saxon
1个回答
0
投票
ApplyTemplates

,我认为您将想要的输出作为字符串获得,或者,撒克逊人当然只写入文件(流),如果您提供流到

ToString()
.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.