2016-04-25 3 views
0

das folgende XML Gegeben:XPath1 - Auswahl Geschwister

<p class='sectiontitle'>Examples</p> 
<p class='paragraphtitle'>Example1</p> 
<p>That's some text.</p> 
<p>That's some text again.</p> 
<p class='paragraphtitle'>Example2</p> 
<p>That's some other text.</p> 
<p>That's some other text again.</p> 
<!-- potentially add more paragraphtitles --> 

<p class='sectiontitle'>New title</p> 
<p>Some non-needed text.</p> 

Ich möchte eine Vorlage laufen auf jedem Absatz Abschnitt zu arbeiten, wo ich den Titel und seine folgenden Inhalt in einigen neuen Tags wickeln.

Also habe ich eine XSLT1.1/Xpath1 Datei, die alle p [@ Klasse = 'Absatztitel'] und innerhalb der Vorlage für diese, möchte ich ihre folgenden Geschwister bis zum nächsten Untertitel oder Abschnitt Titel wählen.

<xsl:template match="p[@class='paragraphtitle']" mode="create-example-block"> 
    <example> 
    <title> 
     <xsl:value-of select="." /> 
    </title> 
    <xsl:apply-templates 
     select="//p[@class='sectiontitle' or @class='paragraphtitle']/preceding-sibling::*[preceding-sibling::p[@class='paragraphtitle'][1] = text() and not(self::p[@class='sectiontitle' or @class='paragraphtitle'] or not(self::*[following-sibling::p[@class='sectiontitle']]))]" /> 
    </example> 
</xsl:template> 

, die nicht die erwartete Ausgabe produziert, in diesem Fall erwarte ich:

<example> 
    <title>Example1</title> 
    <p>That's some text.</p> 
    <p>That's some text again.</p> 
</example> 
<example> 
    <title>Example2</title> 
    <p>That's some other text.</p> 
    <p>That's some other text again.</p> 
</example> 

Kann mir jemand einen Tipp geben?

+0

Siehe http : //stackoverflow.com/a/36781226/252228 zum Beispiel oder ähnliche Fragen und Antworten. –

Antwort

1

können Sie versuchen, diese kleine Änderung Ihrer Vorlage - für alle folgenden Geschwister der Suche, die das aktuelle Element als erste vorhergehenden Geschwister haben:

<xsl:template match="p[@class='paragraphtitle']" mode="create-example-block"> 
     <example> 
      <title> 
       <xsl:value-of select="." /> 
      </title> 
      <xsl:variable name="thisgid" select="generate-id(.)" /> 
      <xsl:apply-templates select="following-sibling::p[ not (@class='sectiontitle' or @class='paragraphtitle')] 
          [generate-id(preceding-sibling::p[ @class='paragraphtitle' or @class='sectiontitle'] [1]) = $thisgid ]"/>    
     </example> 
    </xsl:template> 

Mit der folgenden Ausgabe:

 <example> 
      <title>Example1</title> 
      <p>That's some text.</p> 
      <p>That's some text again.</p> 
     </example> 
     <example> 
      <title>Example2</title> 
      <p>That's some other text.</p> 
      <p>That's some other text again.</p> 
     </example> 
+0

Hallo hr_117, danke für deine Hilfe, das geht fast an meinem Ende. Ich bekomme das richtige Ergebnis für den ersten Beispielblock, aber das scheitert an der 2., es scheint auch die folgenden Elemente der folgenden '

' Elemente einzufangen. – Flag

+0

Schauen Sie sich das Update an (beachten Sie auch Abschnittstitel als vorhergehende Geschwister) –

+0

Großartig, es funktioniert! Vielen Dank, Sie waren eine große Hilfe! :) – Flag