xslt для нескольких выходных - PullRequest
0 голосов
/ 21 февраля 2019

xsl-код следующий

<xsl:template match="/">
  <xsl:for-each select="/t:Flow/t:AccountingRecords/t:AccountingRecord">
    <xsl:result-document method="xml" href="UBL-invoice.2.1-{t:Reference}-output.xml">
      <xsl:apply-templates select="."/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

, он хорошо работает из командной строки, используя transform

, теперь я пытаюсь использовать его из приложения .net и получаюследующая ошибка:

$ exception {"Системный идентификатор основного выходного файла неизвестен"} Saxon.Api.DynamicError

Если я изменю свой код на

<xsl:result-document method="xml" href="file:///d:/temp/UBL-invoice.2.1-{t:Reference}-output.xml">
  <xsl:apply-templates select="."/>
</xsl:result-document>

затем я получаю свои файлы.

Мой вопрос: есть ли способ работать с относительным путем из приложения, или я должен добавить параметр dir в свой xsl?

Мой код вполне тот, что из образцов

Processor proc = new Processor();
var comp = proc.NewXsltCompiler();
Xslt30Transformer exe = comp.Compile(new Uri("file:///" + System.IO.Path.GetFullPath("./Styles/style.xslt"))).Load30();

 DocumentBuilder builder = proc.NewDocumentBuilder();
 builder.BaseUri = new Uri("file:///" + System.IO.Path.GetFullPath("./ar2.xml"));

 XdmNode inp = builder.Build(System.IO.File.OpenRead(System.IO.Path.GetFullPath("./ar2.xml")));

 Serializer serializer = proc.NewSerializer();
 serializer.SetOutputWriter(Console.Out);

 // Transform the source XML and serialize the result document
 exe.ApplyTemplates(inp, serializer); // < ==== Exception here

1 Ответ

0 голосов
/ 22 февраля 2019

Установите свойство BaseOutputURI для объекта Xslt30Transformer.Это будет использоваться в качестве базового URI для разрешения относительного URI, указанного в xsl:result-document/@href.

...