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

Beitrag lesen

Hallo,

die XML-Dateien sind wie folgt aufgebaut:

--> Ausgangsdatei, in die die IDs übertragen werden sollen; wobei das Attribut hilfs-id in der transformierten XML nicht mehr ausgegeben werden soll und ich somit bei der Transformation ignoriert habe.

<volume>
<chapter1>
  <chapter2>
   <region>
    <dataset hilfs-id ="Hilfs-ID_12_100" id="999098">
     <name>Dataset-Name1</name>
    </dataset>
    <dataset hilfs-id ="Hilfs-ID_12_101" id="">
     <name>Dataset-Name2</name>
    </dataset>
   </region>
  </chapter2>
</chapter1>
</volume>

--> ID-Import-Datei (wurde aus einer CSV-Liste per Textimport im XMLSpy in eine XML-Datei gewandelt.)

<Import>
<Row>
  <hilfs_ID>Hilfs-ID_12_100</hilfs_ID>
  <name>Dataset-Name1</name>
  <ID>999098</ID>
</Row>
<Row>
  <hilfs_ID>Hilfs-ID_12_101</hilfs_ID>
  <name>Dataset-Name2</name>
  <ID/>
</Row>
</Import>

ich kenne jetzt nicht den Rest deines XSLs, aber das grundsätzliche Problem bei:

<xsl:choose>  
  <xsl:when test="$import_data/Import/Row/ID!=''">  
    <xsl:attribute name="id">  
      <xsl:value-of select="$import_data//*[hilfs_ID = $hilfs_id]/ID"/>  
    </xsl:attribute>  
  </xsl:when>  
  <xsl:otherwise>  
    <xsl:attribute name="id">  
      <xsl:value-of select="$import_data//*[hilfs_ID = $hilfs_id]/hilfs_ID"/>  
    </xsl:attribute>  
  </xsl:otherwise>  

ist, dass "$import_data/Import/Row/ID" das immer erste Row im import XML nimmt. Dadurch stimmt der Vergleich wohl nie.
Falls du xsl:choose in einem xsl:for-each verwendest, könnte das anderes aussehen, aber wie gesagt: ich kenne den rest deines XSLs nicht.

Wie sieht also die Umgebung von deinem xsl:choose aus?

Solle das keine Rolle spielen, dann kannst du so etwas verwenden:

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

und noch einfacher wäre eigentlich:

  
<xsl:attribute name="id">  
				<xsl:choose>  
					<xsl:when test="@id = ''">  
						<xsl:value-of select="$import_data//*[hilfs_ID = $hilfs_id]/hilfs_ID"/>  
					</xsl:when>  
					<xsl:otherwise>  
						<xsl:value-of select="@id"/>  
					</xsl:otherwise>  
				</xsl:choose>  
			</xsl:attribute>  

Beide würden das ergebnis liefern:
<dataset id="999098"/>
<dataset id="Hilfs-ID_12_101"/>

Grüße
Thomas