Announcement

Collapse
No announcement yet.

XSLT: String teilen und auswerten funktioniert nicht.

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

  • XSLT: String teilen und auswerten funktioniert nicht.

    Hallo,

    folgende Ausgangsdatei:
    Code:
    <Inhalt>
    	<content type="text">
    		<line number="1"/>
    		<line number="2"/>
    		<line number="3"/>
    		<line number="4"> Sanaa: Bei einer Explosion in einer Mu-</line>
    		<line number="5"> nitionsfabrik im Jemen sind mindestens</line>
    		<line number="6"> 70 Menschen ums Leben gekommen und 90</line>
    		<line number="7"> verletzt worden. Unter den Opfern sind</line>
    		<line number="8"> laut Behörden auch Kinder. Die Explo-</line>
    		<line number="9"> sion ereignete sich in der Provinz Ab-</line>
    		<line number="10"> jan im Süden. Nach einem gestrigen Al-</line>
    		<line number="11"> Kaida-Überfall auf die Fabrik seien</line>
    		<line number="12"> heute Anwohner auf der Suche nach Mu-</line>
    		<line number="13"> nition in die Fabrik gegangen, hieß es.</line>
    		<line number="14"/>
    		<line number="15"> Kairo: Die nächsten Parlamentswahlen in</line>
    		<line number="16"> Ägypten werden im September stattfin-</line>
    		<line number="17"> den. Das teilte die Militärregierung</line>
    		<line number="18"> mit. Ein Termin für die Präsidentenwahl</line>
    		<line number="19"> stehe noch nicht fest, hieß es. Das</line>
    		<line number="20"> Militär hatte nach dem Sturz von Präsi-</line>
    		<line number="21"> dent Mubarak vorübergehend die Macht in</line>
    		<line number="22"> Ägypten übernommen.</line>
    		<line number="23"/>
    		<line number="24"/>
    	</content>
    </Inhalt>
    soll zu folgendem Ergebnis transformiert werden:
    Code:
    <content>
    	<marke>Sanaa</marke>
    	<meldung>Bei einer Explosion in einer Munitionsfabrik im Jemen sind mindestens 70 Menschen ums Leben gekommen und 90 verletzt worden. Unter den Opfern sind laut Behörden auch Kinder. Die Explosion ereignete sich in der Provinz Abjan im Süden. Nach einem gestrigen AlKaida-Überfall auf die Fabrik seien heute Anwohner auf der Suche nach Munition in die Fabrik gegangen, hieß es.</meldung>
    	<marke>Kairo</marke>
    	<meldung>Die nächsten Parlamentswahlen in Ägypten werden im September stattfinden. Das teilte die Militärregierung mit. Ein Termin für die Präsidentenwahl stehe noch nicht fest, hieß es. Das Militär hatte nach dem Sturz von Präsident Mubarak vorübergehend die Macht in Ägypten übernommen.</meldung>
    	<marke/>
    	<meldung/>
    </content>
    Bislang scheitere ich aber schon an der Erfassung der Meldung und ihrer Trennung von der Marke. Mein bisheriger Versuch:
    Code:
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xhtml" version="1.0" encoding="UTF-8" indent="yes" cdata-section-elements="title "/>
    	<xsl:template match="Inhalt">
    		<xsl:call-template name="Kurzmeldung">
    		</xsl:call-template>
    	</xsl:template>
    	<xsl:template name="Kurzmeldung" match="Kurzmeldung">
    		<xsl:element name="content">
    			<xsl:for-each-group select="//content[1]/line[@number &gt;= 4 and @number &lt;= 22]" group-ending-with="line[not(node())]">
    				<xsl:variable name="meldung" select="//content[1]/line[@number &gt;= 4 and @number &lt;= 22]"/>
    				<marke>
    					<xsl:value-of select="substring-before ($meldung,': ')"/>
    				</marke>
    				<meldung>
    					<xsl:value-of select="substring-after ($meldung,': ')"/>
    				</meldung>
    			</xsl:for-each-group>
    		</xsl:element>
    	</xsl:template>
    </xsl:stylesheet>
    Irgendeine oder einer eine Idee, woran das hackt?

    Danke!

  • #2
    Folgendes Stylesheet
    Code:
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    
    	<xsl:template match="content">
    		<xsl:copy>
    		  <xsl:variable name="groups">
    			<xsl:for-each-group select="line" group-ending-with="line[not(node())]">
    			  <xsl:if test="current-group()[self::line[node()]]">
    			    <group marke="{normalize-space(substring-before(., ': '))}">
    			      <line><xsl:value-of select="substring-after(., ': ')"/></line>
    			      <xsl:copy-of select="current-group()[position() gt 1]"/>
    			    </group>
    			  </xsl:if>
    			</xsl:for-each-group>
                        </xsl:variable>
                        <xsl:for-each select="$groups/group">
    				<marke>
    					<xsl:value-of select="@marke"/>
    				</marke>
    				<meldung>
    				  <xsl:for-each-group select="line" group-starting-with="line[ends-with(., '-')]">
    				    <xsl:value-of select="replace(current-group()[1], '-$', ''), replace(current-group()[2], '^\s+', ''), current-group()[position() gt 2]"
    				       separator=""/>
    				  </xsl:for-each-group>
    				</meldung>
    		    </xsl:for-each>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    gibt mit Saxon 9.3 das folgende Resultat:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    	<content>
       <marke>Sanaa</marke>
       <meldung>Bei einer Explosion in einer Munitionsfabrik im Jemen sind mindestens 70 Menschen ums Leben gekommen und 90 verletzt worden. Unter den Opfern sind laut Behörden auch Kinder. Die Explo sion ereignete sich in der Provinz Ab jan im Süden. Nach einem gestrigen AlKaida-Überfall auf die Fabrik seien heute Anwohner auf der Suche nach Munition in die Fabrik gegangen, hieß es.</meldung>
       <marke>Kairo</marke>
       <meldung>Die nächsten Parlamentswahlen in Ägypten werden im September stattfinden. Das teilte die Militärregierung mit. Ein Termin für die Präsidentenwahl stehe noch nicht fest, hieß es. Das Militär hatte nach dem Sturz von Präsident Mubarak vorübergehend die Macht in Ägypten übernommen.</meldung>
    </content>
    Das sind in "Explo sion" und "Ab jan" noch Leerzeichen, aber sonst ist das das gewünschte Ergebnis.

    Comment


    • #3
      Ich habe das Stylesheet vereinfacht:
      Code:
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
      
      <xsl:template match="content">
        <xsl:copy>
          <xsl:for-each-group select="line" group-ending-with="line[not(node())]">
            <xsl:if test="current-group()[self::line[node()]]">
              <marke><xsl:value-of select="normalize-space(substring-before(., ': '))"/></marke>
              <meldung>
                <xsl:value-of select="replace(string-join((substring-after(., ': '), current-group()[position() gt 1]), ''), '- ', '')"/>
              </meldung>
            </xsl:if>
          </xsl:for-each-group>
        </xsl:copy>
      </xsl:template>
      
      </xsl:stylesheet>
      Resultat nun
      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      	<content>
         <marke>Sanaa</marke>
         <meldung>Bei einer Explosion in einer Munitionsfabrik im Jemen sind mindestens 70 Menschen ums Leben gekommen und 90 verletzt worden. Unter den Opfern sind laut Behörden auch Kinder. Die Explosion ereignete sich in der Provinz Abjan im Süden. Nach einem gestrigen AlKaida-Überfall auf die Fabrik seien heute Anwohner auf der Suche nach Munition in die Fabrik gegangen, hieß es.</meldung>
         <marke>Kairo</marke>
         <meldung>Die nächsten Parlamentswahlen in Ägypten werden im September stattfinden. Das teilte die Militärregierung mit. Ein Termin für die Präsidentenwahl stehe noch nicht fest, hieß es. Das Militär hatte nach dem Sturz von Präsident Mubarak vorübergehend die Macht in Ägypten übernommen.</meldung>
      </content>
      Solange nicht in einem Text die Zeichenfolge "- " vorkommt, sollte das funktionieren.

      Comment


      • #4
        Merci. Bin in meinen Versuchen auch schon ein wenig weitergekommen. Aber das ist um Klassen besser und eleganter

        Comment

        Working...
        X