XSLT 1.0 File-Erstellung stoppen
Julian P.
- xml
Hi,
ist es möglich, dass man im XSLT festlegt, wenn bestimmte Kriterien erfüllt sind, es gar kein File erstellt.
In meinem Fall z.B. sollte, wenn der InvoiceType = CreditNote kein XML erstellt werden. -> Nur wenn InvoiceType = INVOIC soll das entsprechende XML erstellt werden.
Ist das grundsätzlich möglich?
Vielen Dank
LG Julian
Hallo Julian,
ist es möglich, dass man im XSLT festlegt, wenn bestimmte Kriterien erfüllt sind, es gar kein File erstellt.
In meinem Fall z.B. sollte, wenn der InvoiceType = CreditNote kein XML erstellt werden. -> Nur wenn InvoiceType = INVOIC soll das entsprechende XML erstellt werden.
Ist das grundsätzlich möglich?
Sehe ich für XSLT 1.0 innerhalb des Stylesheets nicht, ggf. durch die Vorverarbeitung mit einer anderen Hostsprache möglich. Etwa via PHP prüfen, ob das gesuchte Element vorkommt und erst dann mit den PHP-XSLT-Techniken transformieren (die können auch nur 1.0).
Ab XSLT 2.0 lässt sich dafür xsl:result-document verwenden:
<xsl:template match="/">
<xsl:if test="...">
<xsl:result-document href="output.xml" method="xml" encoding="UTF-8">
<!-- ... -->
</xsl:result-document>
</xsl:if>
</xsl:template>
Bei der Nutzung von Saxon gibt man in solchen Fällen keinen Output-Parameter (-o:output.xml) an und das Stylesheet entscheidet selbst über die Ausgabe. Darüber hinaus lassen sich mit xsl:result-document n Ausgabedateien in einer Transformation erzeugen (sinnvoll für Multidokument-Strukturen wie CHM, DOCX, EPUB usw.).
java -jar saxon9he.jar -s:input.xml -xsl:transform.xsl
Grüße,
Thomas
danke für die ausführliche info. leider verwenden wir nur 1.0. Mit der von dir angesprochenen PHP-Lösung kenn ich mich leider nicht aus und kann daher nicht sagen, ob das funktionieren würde.
Gibt es so etwas wie if und abort in kombination? -> Sprich: if invoicetype = creditnote -> abort (also es soll quasi ein leeres XML erstellt werden)
<?xml version="1.0" encoding="utf-8"?>
<SALESINVOICE>
<Interchange>
<Recipient>1234</Recipient>
<Sender>5678</Sender>
<CreationDate>2019-01-11:09:16:43</CreationDate>
<Test>No</Test>
<Interchange_Control_Number>123584</Interchange_Control_Number>
<HeaderInformation>
<OrigInvoiceNumber>1</OrigInvoiceNumber>
<InvoiceType>CreditNote</InvoiceType>
</HeaderInformation>
</Interchange>
</SALESINVOICE>
LG Julian
Hi,
Gibt es so etwas wie if und abort in kombination? -> Sprich: if invoicetype = creditnote -> abort (also es soll quasi ein leeres XML erstellt werden)
Wie stellst Du Dir das leere XML vor?
So?
<?xml version="1.0" encoding="utf-8"?>
<SALESINVOICE>
</SALESINVOICE>
Dann im Top-Level-xsl-Template die Bedingung prüfen und nur bei creditnote die anderen Templates aufrufen.
cu,
Andreas a/k/a MudGuard
hi, danke hab folg. lösung gefunden:
<!-- Delete Content of Message, if InvoiceType = CREDITNOTE -->
<xsl:template match="/">
<xsl:apply-templates select="SALESINVOICE[not(Interchange/HeaderInformation/InvoiceType='CREDITNOTE')]"/>
</xsl:template>
Hallo Julian,
Gibt es so etwas wie if und abort in kombination? -> Sprich: if invoicetype = creditnote -> abort (also es soll quasi ein leeres XML erstellt werden)
So würde beim Vorhandensein ein leeres Dokument erzeugt und anderenfalls die entsprechende Ausgabe:
<xsl:template match="/">
<xsl:if test="SALESINVOICE/Interchange/HeaderInformation/InvoiceType != 'CreditNote'">
<!-- Ausgaben ... -->
</xsl:if>
</xsl:template>
Grüße,
Thomas