Thomas J.S.: Abfrage in einem externen XML-Dokument

Beitrag lesen

Hallo,

nachfolgend das gesamte XSL. Das nur das erste Row-Element übernommen wird, ist nicht das Problem, denn wenn eine ID vorhanden ist, dann wird diese auch korrekt für alle Datensätze übergeben. Es fehlt eben nur die Hilfs-ID, falls die reguläre ID nicht vorhanden ist.
Deine beiden Vorschläge haben leider nur für den regulären Fall (das die ID übertragen wird) zum Erfolg geführt.

Ich kann das nicht nachvollziehen.
Ich habe mit dem zwei XML-Dateien die du gepostet hast einen Text gemacht.

Vor dem Übertragen der ID werden noch weitere Elemente und Attribute übertragen. Dies funktioniert jedoch ohne Probleme und ich habe diese in der XSL weggelassen.

  <xsl:variable name="hilfs\_id" select="@hilfs\_id" />  

Das Attribut in deinem XML heisst nicht hilfs_id (mit Unterstrich) sondern hilfs-id (mit Bindestrich)

Wenn ich das XSL was du gepostet hast mit dieser Korrektur verwende:

  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
	<xsl:output method="xml" media-type="text/xml" version="1.0" encoding="UTF-8" indent="yes"/>  
	  
	<xsl:strip-space elements="*" />  
	<xsl:variable name="Import_FileName">  
		<xsl:text>importID2.xml</xsl:text>  
	</xsl:variable>  
	  
	<xsl:variable name="import_data" select="document($Import_FileName)" />  
	  
	<xsl:variable name="newline">  
		<xsl:text>&#xA;</xsl:text>  
	</xsl:variable>  
	  
	<xsl:template match="/">  
		<xsl:value-of select="$newline" />  
		<xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE volume SYSTEM "mpallg.dtd">]]></xsl:text>  
		<xsl:value-of select="$newline" />  
		<xsl:apply-templates select="node()"/>  
	</xsl:template>  
	  
	<xsl:template match="node()|@*">  
		<xsl:copy>  
			<xsl:apply-templates select="@*|node()" />  
		</xsl:copy>  
	</xsl:template>  
	  
	  
	<xsl:template match="dataset">  
		<xsl:variable name="hilfs_id" select="@hilfs-id" />  
		<xsl:element name="dataset">  
			  
			<!-- Übertragen anderer Attribute und Elemente -->  
			  
			<xsl:attribute name="id">  
				<xsl:choose>  
					<xsl:when test="not(@id = '')">  
						<xsl:value-of select="$import_data//*[hilfs_ID = $hilfs_id]/ID"/>  
					</xsl:when>  
					<xsl:otherwise>  
						<xsl:value-of select="$import_data//*[hilfs_ID = $hilfs_id]/hilfs_ID"/>  
					</xsl:otherwise>  
				</xsl:choose>  
			</xsl:attribute>  
			  
			<!-- Übertragen anderer Attribute und Elemente -->	  
		</xsl:element>  
	</xsl:template>  
</xsl:stylesheet>  

bekomme ich folgende korrekte Ausgabe:

  
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE volume SYSTEM "mpallg.dtd">  
<volume>  
   <chapter1>  
      <chapter2>  
         <region>  
            <dataset id="999098"/>  
            <dataset id="Hilfs-ID_12_101"/>  
         </region>  
      </chapter2>  
   </chapter1>  
</volume>  

Grüße
Thomas