XSLT 1.0 Duplikate entfernen
juls_pro_37
- xml
- xsl
0 ThomasM0 juls_pro_370 ThomasM
Hallo zusammen,
bitte um Info, was in meinem Code nicht korrekt ist. -> Benötige keine Duplikate von "TEXT_LINE" unter GRP.
Hier mein XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="HeaderText[generate-id() != generate-id(key('header_text', TEXT_LINE)[1])]" />
<xsl:template match="GRP">
<xsl:copy>
<!--copy content of TXT_001 to GRP, so it can be used to set symbol at SalesTable -->
<xsl:for-each select="./TXT_001">
<xsl:if test="./TEXT_LINE != ''">
<TEXT_LINE>
<xsl:text>yes</xsl:text>
</TEXT_LINE>
</xsl:if>
</xsl:for-each>
<!--copy all other nodes-->
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="HeaderText[generate-id() != generate-id(key('header_text', TEXT_LINE)[1])]" />
<!-- delete empty nodes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
<!-- delete empty nodes -->
</xsl:stylesheet>
und hier mein XML:
<?xml version="1.0"?>
<SEEDELFOR>
<CNT>
<GRP>
<REF_ON>12345</REF_ON>
<TXT_001>
<QUALIFIER>ZZZ</QUALIFIER>
<TEXT_LINE> Test1</TEXT_LINE>
</TXT_001>
<TXT_001>
<QUALIFIER>PUR</QUALIFIER>
<TEXT_LINE> Test2</TEXT_LINE>
</TXT_001>
<ITEM>
<ITEM_NUMBER_EN>1234556789123</ITEM_NUMBER_EN>
</ITEM>
</GRP>
</CNT>
</SEEDELFOR>
Danke & LG Julin
Hallo juls_pro_37,
ich ahne schon, dass hier wieder nicht alles dabei steht, was passieren soll und im Grunde fische ich auch im Trüben. Folgender Ansatz erzeugt <TEXT_LINE>yes</TEXT_LINE>
dort, wo das erste nicht leere TEXT_LINE-Element auftaucht und ignoriert weitere bzw. leere Vorkommen.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TEXT_LINE[. != ''][count(preceding::TEXT_LINE[. != '']) = 0]">
<TEXT_LINE>yes</TEXT_LINE>
</xsl:template>
<xsl:template match="TEXT_LINE[. != ''][count(preceding::TEXT_LINE[. != '']) > 0]"/>
<xsl:template match="TEXT_LINE[. = '']"/>
</xsl:stylesheet>
Erhalte mit dem gezeigten XML-Dokument dieses Ergebnis:
<?xml version="1.0" encoding="UTF-8"?>
<SEEDELFOR>
<CNT>
<GRP>
<REF_ON>12345</REF_ON>
<TXT_001>
<QUALIFIER>ZZZ</QUALIFIER>
<TEXT_LINE>yes</TEXT_LINE>
</TXT_001>
<TXT_001>
<QUALIFIER>PUR</QUALIFIER>
</TXT_001>
<ITEM>
<ITEM_NUMBER_EN>1234556789123</ITEM_NUMBER_EN>
</ITEM>
</GRP>
</CNT>
</SEEDELFOR>
Grüße,
Thomas
Hallo Thomas,
im Grunde will ich, dass wenn es unter "GRP" einen Knoten "TXT_001" gibt, einen neuen Tag mit der Bezeichnung "TEXT_LINE" und dem Wert "yes" stehen haben, aber nur 1x. -> Kommt aktuell der Tag "TXT_001" mehrmals vor erhalte ich mehrmals die "TEXT_LINE" mit dem Wert "yes".
Benötige im Grunde nur die Info, dass Texte (TXT_001) vorhanden sind. -> Vl. gibt es auch eine bessere Lösung.
Aussehen sollte das ganze dann so:
<?xml version="1.0" encoding="UTF-8"?>
<SEEDELFOR>
<CNT>
<GRP>
<TEXT_LINE>yes</TEXT_LINE>
<REF_ON>12345</REF_ON>
<TXT_001>
<QUALIFIER>ZZZ</QUALIFIER>
<TEXT_LINE>Test1</TEXT_LINE>
</TXT_001>
<TXT_001>
<QUALIFIER>PUR</QUALIFIER>
<TEXT_LINE>Test2</TEXT_LINE>
<ITEM>
<ITEM_NUMBER_EN>1234556789123</ITEM_NUMBER_EN>
</ITEM>
</GRP>
</CNT>
</SEEDELFOR>
aktuell sieht es so aus:
<?xml version="1.0" encoding="UTF-8"?>
<SEEDELFOR>
<CNT>
<GRP>
<TEXT_LINE>yes</TEXT_LINE>
<TEXT_LINE>yes</TEXT_LINE>
<REF_ON>12345</REF_ON>
<TXT_001>
<QUALIFIER>ZZZ</QUALIFIER>
<TEXT_LINE>Test1</TEXT_LINE>
<TXT_001>
<QUALIFIER>PUR</QUALIFIER>
<TEXT_LINE>Test2</TEXT_LINE>
<ITEM>
<ITEM_NUMBER_EN>1234556789123</ITEM_NUMBER_EN>
</ITEM>
</GRP>
</CNT>
</SEEDELFOR>
Es soll geprüft werden, ob es einen Tag "TXT_001" gibt wenn ja soll ein Tag unter "GRP" mit dem Wert yes erstellt werden. Aber nur 1x und nicht für jedes weitere "TXT_001.
LG Julian
Hallo Julian
im Grunde will ich, dass wenn es unter "GRP" einen Knoten "TXT_001" gibt, einen neuen Tag mit der Bezeichnung "TEXT_LINE" und dem Wert "yes" stehen haben, aber nur 1x. -> Kommt aktuell der Tag "TXT_001" mehrmals vor erhalte ich mehrmals die "TEXT_LINE" mit dem Wert "yes".
Benötige im Grunde nur die Info, dass Texte (TXT_001) vorhanden sind.
Das klingt doch schon anders, probiere es so:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="GRP">
<GRP>
<xsl:if test="count(//TEXT_LINE) > 0">
<TEXT_LINE>yes</TEXT_LINE>
</xsl:if>
<xsl:apply-templates select="node()|@*"/>
</GRP>
</xsl:template>
Grüße,
Thomas
danke danke danke!!! :) und wieder mal hast du mir sehr geholfen!! :)
LG