xslt для нескольких выходных и базовых выходных каталогов - PullRequest
0 голосов
/ 26 февраля 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>

Мой код вполне тот же, что и в примерах

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

var baseOutUri = new System.Uri(Directory.GetCurrentDirectory());
exe.BaseOutputURI = baseOutUri.AbsoluteUri;
Console.WriteLine(exe.BaseOutputURI);

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

Console.WriteLine пишет:

file: /// D: / dev / fromSvn / cclb / bas / bin / debug

Но выходные данные генерируются в:

D: \ dev \fromSvn \ cclb \ bas \ bin

Если я хочу это исправить, я должен изменить свой код так:

exe.BaseOutputURI = baseOutUri.AbsoluteUri + "/";

Я прав или я что-то пропустил?

1 Ответ

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

Так работает разрешение URI.Если базовый URI равен /a/b/c, а относительный URI равен w.xml, то результатом сопоставления относительного URI с базовым URI будет /a/b/w.xml.Алгоритм разрешения относительного URI - это синтаксическая операция над двумя символьными строками, он никогда не пытается определить, относится ли базовый URI /a/b/c к каталогу, к обычному файлу или к чему-либо конкретному.

...