Announcement

Collapse
No announcement yet.

Strukturbaum rekursiv nach oben durchsuchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Strukturbaum rekursiv nach oben durchsuchen

    Hallo.

    Wie das Topic schon sagt habe ich vor, in einem Strukturbaum, rekursiv nach oben zu laufen und verschiedene Bedingungen zu überprüfen.
    In der XML Datei wird ein Kunde dargestellt, der teilweise 1:1 Attribute hat, wie zB eine KundenID, auf der anderen Seite aber auch 1:N Attribute, wie zB Adressen. Die Funktionalität soll garantieren, dass ich mich bei den 1:N Attributen im richtigen Teilbaum befinde und nicht Attribute aus einem anderen Teilbaum gezogen werden. Das XML ist leider ziemlich unübersichtlich, deswegen teilweise sehr komische Abfragen..

    XML:
    Code:
    <cls:IF_ADDRP_ADDRESS.TY_POSTAL_ADDRESS id="d3019">		<NODE_ID>AVLOCGEN100145EF588EC02DC87F3933664B60E0D</NODE_ID>
    <PARENT_NODE_ID>ADGEN100145EF588EC02DC87F3933664B60E0D</PARENT_NODE_ID>
    			<CONTROLLER/>
    			<ADDRESS_REPRESENTATION_CODE>
    				<CONTROLLER/>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</ADDRESS_REPRESENTATION_CODE>
    			<COUNTRY_CODE>DE</COUNTRY_CODE>
    			<REGION_CODE>
    				<CONTROLLER/>
    				<LIST_ID>DE</LIST_ID>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT>11</CONTENT>
    			</REGION_CODE>
    			<COUNTY_NAME/>
    			<CITY_NAME>Maincity</CITY_NAME>
    			<ADDITIONAL_CITY_NAME/>
    			<DISTRICT_NAME/>
    			<STREET_POSTAL_CODE>55555</STREET_POSTAL_CODE>
    			<POBOX_POSTAL_CODE/>
    			<COMPANY_POSTAL_CODE/>
    			<STREET_PREFIX_NAME/>
    			<ADDITIONAL_STREET_PREFIX_NAME/>
    			<STREET_NAME>Mainstreet</STREET_NAME>
    			<STREET_SUFFIX_NAME/>
    			<ADDITIONAL_STREET_SUFFIX_NAME/>
    			<HOUSE_ID>10</HOUSE_ID>
    			<ADDITIONAL_HOUSE_ID/>
    			<BUILDING_ID/>
    			<ROOM_ID/>
    			<FLOOR_ID/>
    			<CARE_OF_NAME/>
    			<STREET_ADDR_MAIL_NO_DELI_CODE>
    				<CONTROLLER/>
    				<LIST_ID/>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</STREET_ADDR_MAIL_NO_DELI_CODE>
    			<REG_STRUC_ELEMENT_GROUP_CODE>
    				<CONTROLLER/>
    				<LIST_ID/>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</REG_STRUC_ELEMENT_GROUP_CODE>
    			<POBOX_DEVIATING_COUNTRY_CODE/>
    			<POBOX_DEVIATING_REGION_CODE>
    				<CONTROLLER/>
    				<LIST_ID>DE</LIST_ID>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</POBOX_DEVIATING_REGION_CODE>
    			<POBOX_DEVIATING_CITY_NAME/>
    			<POBOX_ID/>
    			<POBOX_INDICATOR>false</POBOX_INDICATOR>
    			<POBOX_ADDR_MAIL_NO_DELI_CODE>
    				<CONTROLLER/>
    				<LIST_ID/>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</POBOX_ADDR_MAIL_NO_DELI_CODE>
    			<TAX_JURISDICTION_CODE>
    				<CONTROLLER/>
    				<LIST_ID>DE</LIST_ID>
    				<LIST_VERSION_ID/>
    				<LIST_AGENCY_ID/>
    				<LIST_AGENCY_SCHEME_ID/>
    				<LIST_AGENCY_SCHEME_AGENCY_ID/>
    				<CONTENT/>
    			</TAX_JURISDICTION_CODE>
    			<TIME_ZONE_CODE>CET</TIME_ZONE_CODE>
    		</cls:IF_ADDRP_ADDRESS.TY_POSTAL_ADDRESS>
    XSLT:
    Code:
    <!-- Template zur rekursiven Suche des richtigen Knoten -->
    	<xsl:template name="searchParent">
    		<xsl:param name="dataRef"/>
    		<xsl:param name="count">0</xsl:param>
    		
    		<xsl:choose>
    			<xsl:when test="./PARENT_NODE_ID">
    				<xsl:variable name="parID"><xsl:value-of select="./PARENT_NODE_ID"/></xsl:variable>
    				<xsl:for-each select="//NODE_ID[ancestor::asx:heap]">
    					<xsl:variable name="tmpID"><xsl:value-of select="./NODE_ID"/></xsl:variable>
    					<xsl:if test="$tmpID = $parID">
    						<xsl:variable name="tmpRef"><xsl:value-of select="node()/@id"/></xsl:variable>
    						<xsl:choose>
    							<xsl:when test="$tmpRef = $dataRef">
    								<xsl:value-of select="'1'"/>
    							</xsl:when>
    							<xsl:otherwise>
    								<xsl:call-template name="searchParent">
    									<xsl:with-param name="dataRef" select="$dataRef"/>
    									<xsl:with-param name="count" select="$count + 1"/>
    								</xsl:call-template>
    							</xsl:otherwise>
    						</xsl:choose>
    					</xsl:if>
    				</xsl:for-each>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:choose>
    					<xsl:when test="$count = '0'">
    						<xsl:value-of select="'1'"/>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:value-of select="'0'"/>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    Mein Problem ist nun, dass bei der Abfrage: <xsl:when test="./PARENT_NODE_ID"> niemals in den darunter liegenden Code gesprungen wird, selbst wenn die PARENT_NODE_ID vorhanden ist. Ein Debuggen war leider nicht möglich, da die Breakpoints in der xsl:choose einfach übersprungen wurden, obwohl es eindeutig ausgelöst wurde.
    Wenn einem irgend etwas an diesem Codefragment spanisch vorkommt, dann bitte melden!

    Danke schonmal im Vorraus für eure Antworten!

    Gruß,
    Engel

  • #2
    Beim debuggen ist mir eine Sache aufgefallen: Das Template wird einmal normal durchlaufen und auch richtig, aber beim zweiten Durchlauf springt er automatisch wieder an die Stelle, an der er vorher ausgestiegen ist. Also das xsl:value-of select. Kann mir einer sagen wie ich aus einem Template komplett aussteige? Also was wie nen "return" in Java zum Beispiel..

    Danke schonmal im vorraus!

    Comment

    Working...
    X