Übereinstimmende Vorlagen mit unterschiedlicher Konfiguration auf demselben Knoten
Ich habe meine gesamte Frage hier zum Stapelüberlauf gestellt . Ich werde versuchen, sie zu zerhacken:
Ich muss eine XML aus dieser Quelle erstellen: ganz kurz:
<?xml version="1.0" encoding="UTF-8"?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007<DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL24.POSNR>2</E1EDL24.POSNR>
(random number of these)
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR> <!--(these are the line items, equal to the number of ROW)-->
</ROW>
<ROW>...
Das ist das, was ich benötige:
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI-DC40</TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>649758</VBELN>
<E1EDL18 SEGMENT="1"><QUALF>ORI</QUALF></E1EDL18>
<E1EDT13 SEGMENT="1"><QUALF>007</QUALF></E1EDT13>
<E1EDT13 SEGMENT="1"><QUALF>015</QUALF></E1EDT13>
<E1EDL24 SEGMENT="1">
<POSNR>000001</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>2</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1"> <!-- (random number of these, as commented above) -->
...
</E1EDL24>
</E1EDL20>
</IDOC>
</DELVRY05>
Dies ist die Idee, die ich für die xsl hatte:
<xsl:template match="/*">
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<xsl:apply-templates select="headers"/>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<xsl:apply-templates select="main"/>
<xsl:apply-templates select="fm:ROW"/>
</E1EDL20>
</IDOC>
</DELVRY05>
</xsl:template>
Da sowohl die Zeilen als auch die Überschriften im E1EDL20-Tag enthalten sind, werden zwei Vorlagen benötigt, und beide beziehen sich im Quellcode auf dasselbe Tag. Wie in den Spezifikationen angegeben, wird nur die letzte Vorlage verwendet. (Es werden also "Header" und "Zeilen" angezeigt, aber nicht "Haupt":
<xsl:template name="main" match="fm:ROW[1]"> ...
<xsl:template name="headers" match="fm:ROW[1]"> ...
<xsl:template name="lines" match="fm:ROW"> ...
Wie löse ich das?
Bearbeiten:
@Sebastien: Ihre Lösung hat für den Quellcode, den ich ursprünglich bereitgestellt hatte, hervorragend funktioniert. Hervorragende Antwort. Ich habe jedoch einen Fehler in dem von mir angegebenen Code gemacht, ich entschuldige mich.
Dies ist das Format des Quellcodes:
<?xml version="1.0" encoding="UTF-8"?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR>
</ROW>
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>2</E1EDL24.POSNR>
<E1EDL41.QUALI>002</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR>
</ROW>
</FMPDSORESULT>
Die Herausforderung besteht darin, dass ich ein Tag mit den Überschriften haben sollte, aber die Werbebuchungen wie folgt untereinander aufgelistet werden sollten:
<?xml version="1.0" encoding="utf-16"?>
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI_DC40</TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>649758</VBELN>
<E1EDL18 SEGMENT="1">
<QUALF>ORI</QUALF>
</E1EDL18>
<E1EDL24 SEGMENT="1">
<POSNR>000001</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>2</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>002</QUALI>
</E1EDL41>
</E1EDL24>
</E1EDL20>
</IDOC>
</DELVRY05>
Danke, dass du mit mir zusammen bist. Ich schätze Ihre Hilfe sehr !!
Sehr verpflichtet, Tom
Antworten
Hier ist ein Beispiel für den Einstieg. Ihrer Frage fehlen einige Details, einige habe ich als Regeln angenommen.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fm="http://www.filemaker.com/fmpdsoresult"
exclude-result-prefixes="fm"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<DELVRY05>
<xsl:apply-templates select="fm:FMPDSORESULT/fm:ROW[1]"/>
</DELVRY05>
</xsl:template>
<xsl:template match="fm:ROW">
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM><xsl:value-of select="fm:EDI_DC40.TABNAM/fm:DATA"/></TABNAM>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN><xsl:value-of select="fm:E1EDL20.VBELN/fm:DATA"/></VBELN>
<E1EDL18 SEGMENT="1"><QUALF><xsl:value-of select="fm:E1EDL18.QUALF/fm:DATA"/></QUALF></E1EDL18>
<!-- Same principle as above for E1EDT13.1, E1EDT1.2, etc. -->
<!-- Use template for elements that are present mutltiple times. -->
<xsl:apply-templates select="../fm:ROW/fm:E1EDL24.POSNR"/>
</E1EDL20>
</IDOC>
</xsl:template>
<xsl:template match="fm:E1EDL24.POSNR">
<E1EDL24 SEGMENT="1">
<POSNR><xsl:value-of select="."/></POSNR>
<E1EDL41 SEGMENT="1">
<QUALI><xsl:value-of select="../fm:E1EDL41.QUALI"/></QUALI>
</E1EDL41>
</E1EDL24>
</xsl:template>
</xsl:stylesheet>
Sehen Sie, wie es hier funktioniert: https://xsltfiddle.liberty-development.net/6q1SDka/1