2017-03-17 7 views
0

Ich habe TEI (Text Encoding Initiative) DokumentTransforming TEI p in lg

<div> 
    <p> 
    some text, and maybe nodes <note>A note</note><lb /> 
    and some more text<lb /> 
    final line without lb 
    </p> 
</div> 

enthält, und ich möchte es zu transformieren zu:

<div> 
    <lg> 
    <l>some text, and maybe nodes <note>A note</note></l> 
    <l>and some more text</l> 
    <l>final line without lb</l> 
    </lg> 
</div> 

Umwandlung der p zu lg trivial ist

unter Verwendung
<xsl:template match="tei:div/tei:p"> 
    <lg> 
    <xsl:apply-templates/> 
    </lg> 
</xsl:template> 

Aber der Rest kann ich nicht herausfinden, wie es geht. Eine Folge von Knoten in Kinder eines neuen Elternteils verwandeln.

Wenn es eine Lösung für xslt 1.0 gibt, wäre es großartig.

Antwort

0

Sie könnten hier eine Technik namens Muenchian grouping verwenden. In diesem Fall können Sie gruppieren die untergeordneten Knoten eines p Element durch die Anzahl der lb Elemente, die sie

<xsl:key name="p-nodes" match="tei:p/node()" use="concat(generate-id(..), '|', count(following-sibling::tei:lb))" /> 

Um den ersten Knoten in jeder Gruppe folgen, die jede l repräsentieren werden Sie ausgegeben werden sollen, würden Sie sie wählen wie so ...

<xsl:for-each 
    select="node()[generate-id() = generate-id(key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[1])]"> 

und zur Ausgabe der <l> Tag selbst und die Inhalte der Gruppe, verwenden sie die Taste erneut ...

<l><xsl:apply-templates select="key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[not(self::tei:lb)]" /></l> 

Versuchen Sie, diese XSLT (offensichtlich den Namespace für das tei Präfix zu ändern in Ihrem XML den echten entsprechen)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:tei="tei"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="p-nodes" match="tei:p/node()" use="concat(generate-id(..), '|', count(following-sibling::tei:lb))" /> 

    <xsl:template match="tei:div/tei:p"> 
     <lg> 
      <xsl:variable name="parentId" select="generate-id()" /> 
      <xsl:for-each select="node()[generate-id() = generate-id(key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[1])]"> 
       <l><xsl:apply-templates select="key('p-nodes', concat($parentId, '|', count(following-sibling::tei:lb)))[not(self::tei:lb)]" /></l> 
      </xsl:for-each> 
     </lg> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

es in Aktion bei http://xsltransform.net/gWEamMf

+0

Hallo. Vielen Dank @ tim-c :) Ich denke, ich habe noch viel mehr über xslt zu lernen. –

+0

Sie können sich auch die Antwort von michael.hor257K ansehen. Es ist sauberer und effizienter. –

1

Hier ist eine andere Art und Weise man es sehen konnte. Es verwendet einen Schlüssel, um jeden Knoten mit seinem nächstliegenden lb Trennzeichen zu verbinden. So können Sie jede Gruppe (mit Ausnahme der ersten ein) durch die eindeutige ID des führenden Separator holen:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:key name="following-nodes" match="node()[not(self::lb)]" use="generate-id(preceding-sibling::lb[1])" /> 

<xsl:template match="p[lb]"> 
    <lg> 
     <l> 
      <xsl:apply-templates select="lb[1]/preceding-sibling::node()"/> 
     </l> 
     <xsl:for-each select="lb"> 
      <l> 
       <xsl:apply-templates select="key('following-nodes', generate-id())"/> 
      </l> 
     </xsl:for-each> 
    </lg> 
</xsl:template> 

</xsl:stylesheet> 

Dieses Beispiel keine Namensräume verwendet, weil Ihre Frage nicht nicht definiert Sie.

+0

Vielen Dank @ michael.hor257k :) Ich fühle mich wirklich wie ein Newbee auf Xslt. Und das war das erste, was ich tun musste. –