JanineS: XSL | index-of

Hallo SelfHTML-Community, hallo Thomas (da du mir in der Vergangenheit schon oft und gut geholfen hast!),

ich möchte mit XSL gerne abprüfen, ob in einer bestimmten Zeichenkette wiederkehrender Elemente eine Abkürzung aus einer Liste auftaucht. Die Abkürzung wird stets in Klammern geschrieben. Die Quelldatei sieht (stark vereinfacht) in etwa so aus:

<?xml version="1.0" encoding="UTF-8"?>
<all>
	<abbreviations>
			<abbr>ABG</abbr>
			<abbr>AGI</abbr>
			<abbr>BBL</abbr>
			<abbr>ECK</abbr>
	</abbreviations>
	<documents>
		<doc no="1">In diesem Doc taucht die Abkürzung (ABG) auf.</doc>
		<doc no="2">Dieses Doc besitzt keine Abkürzung.</doc>
		<doc no="3">Noch eine Abkürzung (BBL).</doc>
		<doc no="4">Und hier (ECK).</doc>
		<doc no="5">Und hier nochmal (ECK).</doc>
	</documents>
</all>

Nur leider habe ich noch irgendwo einen Fehler beim index-of. Vielleicht sehen die Geübteren von euch gleich, woran es bei mir hakt. Ich grübel seit gestern abend und finde keine Lösung :(

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0">
	<xsl:output method="xml" encoding="UTF-8"/>
	<xsl:template match="all">
		<xsl:variable name="abbr" select="abbreviations/abbr"/>
		<all>
			<xsl:for-each select="//doc">
				<xsl:variable name="actdoc" select="."/>
				<xsl:if test="fn:contains($actdoc, fn:index-of($abbr, $actdoc))">
					<doc>
						<xsl:attribute name="no"><xsl:value-of select="@no"/></xsl:attribute>
						<xsl:value-of select="$actdoc"/>
					</doc>
				</xsl:if>
			</xsl:for-each>
		</all>
	</xsl:template>
</xsl:stylesheet>

Die Ausgabe sollte in etwa so aussehen:

<all>
	<doc no="1">ABG</doc>
	<doc no="3">BBL</doc>
	<doc no="4">ECK</doc>
	<doc no="5">ECK</doc>
</all>

Danke schonmal für eure Hilfe! Viele Grüße Janine S.

akzeptierte Antworten

  1. Hallo Janine,

    Nur leider habe ich noch irgendwo einen Fehler beim index-of. Vielleicht sehen die Geübteren von euch gleich, woran es bei mir hakt. Ich grübel seit gestern abend und finde keine Lösung :(

    Probiere es so:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0"
      exclude-result-prefixes="#all">
    
      <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    
      <xsl:template match="all">
        <xsl:variable name="abbr" select="abbreviations/abbr"/>
        <all>
          <xsl:for-each select="//doc">
            <xsl:variable name="actdoc" select="."/>
            <xsl:variable name="no" select="@no"/>
            <xsl:for-each select="$abbr">
              <xsl:if test="fn:contains($actdoc, .)">
                <doc no="{$no}">
                  <xsl:value-of select="."/>
                </doc>
              </xsl:if>
            </xsl:for-each>
          </xsl:for-each>
        </all>
      </xsl:template>
    </xsl:stylesheet>
    

    Grüße,
    Thomas

    1. Hallo Thomas,

      mal wieder vielen lieben Dank für deine Hilfe! Bei ineinander verschachtelten Schleifen bekomme ich regelmäßig einen Knoten im Kopf. Aber die Abfrage funktioniert und ich kann über beide for-each bestimmte Variablen definieren, die ich später wieder aufrufe. Wunderbar!

      Wo hast du dein ganzes Wissen her? Vielleicht sollte ich bei dir einmal eine Schulung besuchen ;)

      Viele Grüße, Janine