XRechnung을 HTML로 변환하기 위해 itplr-kosit의 xrechnung-visualization 을 사용하여 .NET / C #으로 XRechnung 시각화 도우미를 구현하고 싶습니다 . 프로세서로서 저는 Saxonica의 Saxon-HE를 사용 합니다. 이제 나는 자동 폐쇄 DIV의 형태로 출력으로 잘못된 HTML로 고생하고 있습니다.
변환 코드는 다음과 같습니다.
public static string TransformXml(string xmlData, string xslData)
{
var xsltProcessor = new Saxon.Api.Processor();
var documentBuilder = xsltProcessor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
var xdmNode = documentBuilder.Build(new StringReader(xmlData));
var xsltCompiler = xsltProcessor.NewXsltCompiler();
var xsltExecutable = xsltCompiler.Compile(new StringReader(xslData));
var xsltTransformer = xsltExecutable.Load();
xsltTransformer.InitialContextNode = xdmNode;
var results = new Saxon.Api.XdmDestination();
xsltTransformer.Run(results);
return results.XdmNode.OuterXml;
}
호출 :
var xmlData = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "xrechnung.xml"));
var xslDataToXR = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "cii-xr.xsl"));
var xslDataToHTML = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "xrechnung-html.xsl"));
var xrXMLData = TransformXml(xmlData, xslDataToXR);
var htmlData = TransformXml(xrXMLData, xslDataToHTML);
File.WriteAllText(Path.Combine(Directory.GetCurrentDirectory(), "result.html"), htmlData);
작동 ... 문제까지, 결과 HTML에서 채워지지 않은 모든 필드는 자체 닫는 DIV 태그 로 변환됩니다 .
예를 들어, 다음 스 니펫은 xrechnung-html.xsl
...
<div class="boxzeile">
<div class="boxdaten legende">Postfach:</div>
<div id="BT-51" title="BT-51" class="boxdaten wert"><xsl:value-of select="xr:BUYER_POSTAL_ADDRESS/xr:Buyer_address_line_2"/></div>
</div>
... xml은에 대한 값을 제공하지 않으므로 다음 HTML로 렌더링됩니다 Buyer_address_line_2
.
<div class="boxzeile">
<div class="boxdaten legende">Postfach:</div>
<div id="BT-51" title="BT-51" class="boxdaten wert"/>
</div>
브라우저는 자체 닫는 DIV를 열린 태그로 해석하고 전체보기가 손상됩니다.
어떤 아이디어?
Saxon이 XdmDestination을 사용하지 않고 Serializer를 사용하여 파일이나 스트림 또는 문자열 작성기에 직접 작성하여 직렬화를 수행하도록한다면 HTML 직렬화 규칙을 준수한다고 확신합니다. XML 및 XSLT의 맥락에서 파일에서 문자열을 읽거나 파일 API를 사용하여 파일에 문자열을 쓰는 대신 XML 파서 및 XSLT 프로세서가 입력 구문 분석 및 출력 직렬화를 가능한 한 많이 처리하도록하는 것이 좋습니다.
두 가지 변환을 연결하려는 것처럼 보이므로
var xslt1 = xsltExecutable1.Load30();
var xslt2 = xsltExecutable2.Load30();
using (var inputStream = File.OpenRead(Path.Combine(Directory.GetCurrentDirectory(), "xrechnung.xml")) {
using (var resultStream = File.OpenWrite(Path.Combine(Directory.GetCurrentDirectory(), "result.html") {
xslt1.Transform(inputStream , xslt2.AsDocumentDestination(xslt2.NewSerializer(resultStream)));
}
}
실행 가능한 접근 방식입니다.
물론 XSLT 3에서 두 스타일 시트를 직접 변경할 수도 있습니다.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="step1-uri" as="xs:string">https://github.com/itplr-kosit/xrechnung-visualization/raw/master/src/xsl/ubl-invoice-xr.xsl</xsl:param>
<xsl:param name="step2-uri" as="xs:string">https://github.com/itplr-kosit/xrechnung-visualization/raw/master/src/xsl/xrechnung-html.xsl</xsl:param>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<xsl:sequence
select="transform(map {
'source-node' : .,
'stylesheet-location' : $step1-uri
})?output ! transform(map {
'source-node' : .,
'stylesheet-location' : $step2-uri
})?output"/>
</xsl:template>
</xsl:stylesheet>
일반적으로 fold-left
일련의 스타일 시트를 연결하는 데 사용할 수 있습니다 .
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="step1-uri" as="xs:string">https://github.com/itplr-kosit/xrechnung-visualization/raw/master/src/xsl/ubl-invoice-xr.xsl</xsl:param>
<xsl:param name="step2-uri" as="xs:string">https://github.com/itplr-kosit/xrechnung-visualization/raw/master/src/xsl/xrechnung-html.xsl</xsl:param>
<xsl:param name="xslt-locations" as="xs:string*" select="$step1-uri, $step2-uri"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<xsl:sequence
select="fold-left(
$xslt-locations,
.,
function($doc, $xslt-location) {
transform(map { 'source-node' : $doc, 'stylesheet-location' : $xslt-location })?output
}
)"/>
</xsl:template>
</xsl:stylesheet>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다