Aus XML -> HTML -> doppelte Einträge vermeiden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Aus XML -> HTML -> doppelte Einträge vermeiden

    Hi,

    ich habe hier ein größeres XML File mit Produkten. Diese Produkte lasse ich mir als HTML erzeugen. Nun sind teilweise Produkte doppelt in der XML (weil die als Zubehör zu mehreren Produkten gehören können).
    Jetzt kommt natürlich beim schreiben der HTML Dateien der Fehler, dass die Seite schon vorliegt und mein batch bricht ab:
    Error at xsl:result-document on line 30 of web_export.xsl:
    XTDE1490: Cannot write more than one result document to the same URI:
    file:/F:/99_Daten/XML/batch_web/web/290-1AF00%20-%2035%20mm%20Profilschiene.html


    Wie kann ich das denn umgehen? Sprich am liebsten wäre mir, wenn vorhandene Dateien einfach ignoriert werden würden.
  • Hi,
    schau dir dazu mal diesen Thread an: XSLT Wordcount - doppelte Elementinhalte zählen

    Mein Ansatz war damals die Liste zu sortieren und aufs vorhergehende Element zu prüfen:

    Quellcode

    1. <xsl:for-each select="/haus/bereich">
    2. <xsl:sort select="." />
    3. <xsl:choose>
    4. <xsl:when test="not(preceding-sibling::bereich = .)">


    xml_looser hat jedoch mit key() eine schönere Lösung gepostet.
  • So da bin ich wieder.
    Ich sortiere in meinem Fall nicht nach dem Knoten, sondern nach einem im Knoten enthaltenen Attribut:

    Quellcode

    1. <xsl:for-each select="//PRO">
    2. <xsl:sort select="PRAT[@name='ARTIKELNUMMER']/VALUE/text()" data-type="text" order="ascending"/>
    3. <TR minheight="1,5" grow="1">
    4. <TD style="Preisliste:Preisliste_Zelle" alignment="0" rundisttop="1" rundistbottom="1" rundistleft="1" rundistright="1" strokewidth="0,5" strokecolor="Black" strokevalue="100">
    5. <xsl:value-of select="PRAT[@name='ARTIKELNUMMER']/VALUE/text()"/>
    6. </TD>
    7. <TD style="Preisliste:Preisliste_Zelle" alignment="0" rundisttop="1" rundistbottom="1" rundistleft="1" rundistright="1" strokewidth="0,5" strokecolor="Black" strokevalue="100">
    8. <xsl:choose>
    9. <xsl:when test="PRAT[@name='IPRO_BESCHREIBUNG']/VALUE/text() != ''"><ABSATZ style="Preisliste:Preisliste_Zelle_Bold"><xsl:value-of select="PRAT[@name='IPRO_BESCHREIBUNG']/VALUE/text()"/></ABSATZ></xsl:when>
    10. <xsl:otherwise><ABSATZ style="Preisliste:Preisliste_Zelle_Bold"><xsl:value-of select="PRAT[@name='PRODUKTNAME']/VALUE/text()"/></ABSATZ></xsl:otherwise>
    11. </xsl:choose>
    12. </TD>
    13. <TD style="Preisliste:Preisliste_Zelle_rb" alignment="0" rundisttop="1" rundistbottom="1" rundistleft="1" rundistright="1" strokewidth="0,5" strokecolor="Black" strokevalue="100">
    14. <xsl:if test="normalize-space(PRAT[@name='RABATTIERFAEHIG']/VALUE/text()) = '0'">
    15. <RABATT/><BLANK/>
    16. </xsl:if>
    17. <xsl:if test="string-length(PRAT[@name='PREIS_NETTO']/VALUE/text())">
    18. <xsl:value-of select="format-number(PRAT[@name='PREIS_NETTO']/VALUE/text(), $formatString, $formatName)"/>
    19. </xsl:if>
    20. </TD>
    21. </TR>
    22. </xsl:for-each>
    Alles anzeigen


    Nur wie vermeide ich da jetzt doppelte Einträge? Weil in Eueren Beispielen sortiert Ihr ja direkt am Knoten (wenn ich mich nicht irre).