juls_pro_37: XSLT 1.0 Duplikate entfernen

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

akzeptierte Antworten

  1. 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

    1. 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

      1. 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

        1. danke danke danke!!! :) und wieder mal hast du mir sehr geholfen!! :)

          LG