juls_pro_37: kein korrekter output eines speziellen tags xslt 1.0

Hi,

wie kann ich mein XSLT richtigstellen, damit ich nur den wert des tags "NUMBER" unter folg. Vorraussetzungen erhalten: "GRP"/"ADD"/"QUALIFIER"(ST) und anschließend prüfen ob unter "contact" der "QUALIFIER" = "EM" vorhanden ist und den wert von "NUMBER" ausgeben:

so sollte es aussehen: <CONTACT_EMAIL>test@test.de</CONTACT_EMAIL>

<?xml version="1.0"?>
<TEST>	
	<CNT>	
		<GRP>
			<ADD>
				<QUALIFIER>DP</QUALIFIER>				
				<PARTY_NAME_1>Vorname Nachname</PARTY_NAME_1>
				<STREET_1>Strasse 1</STREET_1>
				<CITY>Ort</CITY>
				<POSTAL_CODE>12345</POSTAL_CODE>
				<COUNTRY_CODE>DE</COUNTRY_CODE>
				<CONTACT>
					<QUALIFIER>TE</QUALIFIER>
					<NUMBER>4657</NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER>EM</QUALIFIER>
					<NUMBER>test2@test.de</NUMBER>
				</CONTACT>
			</ADD>		
			<ADD>
				<QUALIFIER>ST</QUALIFIER>
				<PARTY_NAME_1>Vorname Nachname</PARTY_NAME_1>
				<STREET_1>Strasse 1</STREET_1>
				<CITY>Ort</CITY>
				<POSTAL_CODE>12345</POSTAL_CODE>
				<COUNTRY_CODE>DE</COUNTRY_CODE>
				<CONTACT>
					<QUALIFIER>TE</QUALIFIER>
					<NUMBER>12345</NUMBER>
				</CONTACT>
				<CONTACT>
					<QUALIFIER>EM</QUALIFIER>
					<NUMBER>test@test.de</NUMBER>
				</CONTACT>
			</ADD>			
		</GRP>
	</CNT>
</TEST>

Meine Idee (was jedoch nicht funktioniert):

    <xsl:template match="GRP">
      <xsl:copy>
        <xsl:for-each select ="./ADD/CONTACT[QUALIFIER='ST']">
          <xsl:if test="./QUALIFIER='EM'">
            <CONTACT_EMAIL>
              <xsl:value-of select="NUMBER"/>
            </CONTACT_EMAIL>
          </xsl:if>
        </xsl:for-each>
        <!--copy all other nodes -->
        <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
    </xsl:template>

edit: ohne [QUALIFIER = 'ST'] unter for-each select erhalte ich leider beide werte (auch wo der qualifier unter add "DP" ist)

 <xsl:template match="GRP">
      <xsl:copy>
        <xsl:for-each select ="./ADD/CONTACT">
          <xsl:if test="./QUALIFIER='EM'">
            <CONTACT_EMAIL>
              <xsl:value-of select="NUMBER"/>
            </CONTACT_EMAIL>
          </xsl:if>
        </xsl:for-each>
        <!--copy all other nodes -->
        <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
    </xsl:template>

<CONTACT_EMAIL>test2@test.de</CONTACT_EMAIL> <CONTACT_EMAIL>test@test.de</CONTACT_EMAIL>

Vielen Dank

LG Julian

  1. Tach!

    wie kann ich mein XSLT richtigstellen, damit ich nur den wert des tags "NUMBER" unter folg. Vorraussetzungen erhalten: "GRP"/"ADD"/"QUALIFIER"(ST) [...]

    Wenn das ADD ein bestimmtes Kindelement haben muss, musst der XPath das auch so angeben.

        <xsl:for-each select ="./ADD/CONTACT[QUALIFIER='ST']">
    

    Hier prüfst du auf Kinder von CONTACT nicht von ADD.

    und anschließend prüfen ob unter "contact" der "QUALIFIER" = "EM" vorhanden ist und den wert von "NUMBER" ausgeben:

    so sollte es aussehen: <CONTACT_EMAIL>test@test.de</CONTACT_EMAIL>

    Ja, wenn man den XPath korrekt ausgehend von ADD wählt.

    Also, für jedes ./ADD[QUALIFIER='ST'] testen ob ./CONTACT/QUALIFIER='EM' (wobei der Test wegfallen kann, wenn immer solch ein Element vorhanden ist) und dann den Wert von CONTACT[QUALIFIER='EM']/NUMBER wählen.

    dedlfix.

    1. danke danke danke für die hilfe und ausführliche erklärung!! 😀