Gå til innhold

[Løst]Hvordan wrappe alt mellom to tagger i XSL ?


Anbefalte innlegg

Jeg har en struktur som dette:

 

<level1>
 <h1>Tittel</h1>
 <p>tekst</p>
 <p>tekst</p>

 <h2>Undertittel</h2>
 <p>tekst</p>
 <pagenum id="page2"/>
 <p>tekst</p>

 <h2>Undertittel</h2>
 <p>tekst</p>
 <p>tekst</p>
</level1>

 

... og trenger vha. XSL å få pakket inn under-seksjonene som dette:

 

<level1>
 <h1>Tittel</h1>
 <p>tekst</p>
 <p>tekst</p>

 <level2>
<h2>Undertittel</h2>
<p>tekst</p>
<pagenum id="page2"/>
<p>tekst</p>
 </level2>

 <level2>
<h2>Undertittel</h2>
<p>tekst</p>
<p>tekst</p>
 </level2>
</level1>

 

Altså; alt mellom to <h2>'er, eller mellom en <h2> og en </level1>, skal pakkes inn i en <level2>.

 

(Jeg trenger tilsvarende for h3, h4 etc. også men det regner jeg med blir bare copy/paste av dette)

 

Hvordan får jeg til dette?

Lenke til kommentar
Videoannonse
Annonse

Jeg har funnet en løsning. Dette er fra xsl-list at lists.mulberrytech.com :

 

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/2009/mf"
exclude-result-prefixes="xs mf">

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:function name="mf:group" as="node()*">
  <xsl:param name="nodes" as="node()*"/>
  <xsl:param name="level" as="xs:integer"/>
  <xsl:for-each-group select="$nodes" group-starting-with="headline[@level = $level]">
 <xsl:choose>
   <xsl:when test="self::headline[@level = $level]">
	 <xsl:element name="level{$level}">
	   <xsl:element name="h{$level}">
		 <xsl:value-of select="."/>
	   </xsl:element>
	   <xsl:sequence select="mf:group(current-group() except ., $level + 1)"/>
	 </xsl:element>
   </xsl:when>
   <xsl:otherwise>
	 <xsl:copy-of select="current-group()"/>
   </xsl:otherwise>
 </xsl:choose>
  </xsl:for-each-group>
</xsl:function>

<xsl:template match="document">
  <xsl:variable name="v1">
 <headline level="1"><xsl:value-of select="metaData/title"/></headline>
 <xsl:copy-of select="contentSection/node()"/>
  </xsl:variable>
  <body>
 <xsl:sequence select="mf:group($v1/node(), 1)"/>
  </body>
</xsl:template>

</xsl:stylesheet>

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...