2016-06-22 15 views
0

ich dieses Beispieldokument haben:XSLT Verkettung von Tags

<root> 
    <span class="a">te</span><span class="a">st</span> <span class="a">tag</span> 
    some other text 
    <span class="b">keep</span> 
</root> 

Ich mag würde, so etwas haben:

<root> 
    <span class="a">test tag</span> 
    some other text 
    <span class="b">keep</span> 
</root> 

Oder zumindest dies:

<root> 
    <span class="a">test</span> <span class="a">tag</span> 
    some other text 
    <span class="b">keep</span> 
</root> 

Es wird Variable Anzahl von class="a" Spannen sein. Ist es in XSLT möglich?

EDIT

versucht zu lösen:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*/span[@class = 'a']"/> 
    <xsl:template match="*/span[@class = 'a'][1]"> 
     <span class="a"> 
      <xsl:for-each select="../span[@class = 'a'] | ../text()[. = ' ']"> 
       <xsl:choose> 
        <xsl:when test=". = ' '"> 
         <xsl:copy/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="./text()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each> 
     </span> 
    </xsl:template> 
</xsl:stylesheet> 

aber wenn ich diesen Eingang?

<root> 
    <span class="a">te</span><span class="a">st</span> <span class="a">tag</span> 
    some other text 
    <span class="b">keep</span> 
    <span class="a">te</span><span class="a">st</span> <span class="a">tag</span> 
</root> 

Wie löst man das?

+0

Die Antwort ist "Ja! Es ist möglich". Können Sie sagen, ob Sie XSLT 1.0 oder 2.0 verwenden? Vielen Dank! –

+0

Bis jetzt habe ich XSLT 1.0 benutzt, da es keine Unterstützung von 2.0 in Pythons Lxml gibt. Ich sehe, es gibt die Möglichkeit von 2.0 durch Java, aber ich benutze es jetzt nicht. Wenn es ein Programm für Linux gibt, kann ich Ihnen raten, dass ich glücklich bin :-), aber wenn nicht, muss ich bei XSLT 1.0 bleiben. – d3im

+0

"* Es wird eine variable Anzahl von Klassen geben =" a "umspannen. *" Aber werden sie immer benachbart sein, oder getrennt durch Leerraum nur Textknoten, wie in Ihrem Beispiel gezeigt? Und was ist mit anderen Klassen - sollen sie auch zusammen gruppiert werden? –

Antwort

0

Die zweite Variante kann erreicht werden durch:

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:key name="grp" 
     match="span[@class='a'][preceding-sibling::node()[1][self::span[@class='a']]]" 
     use="generate-id(preceding-sibling::span[@class='a'][not(preceding-sibling::node()[1][self::span[@class='a']])][1])" /> 

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

<xsl:template match="span[@class='a'][not(preceding-sibling::node()[1][self::span[@class='a']])]" priority="1"> 
    <span class="a"> 
     <xsl:for-each select=". | key('grp', generate-id())" > 
      <xsl:value-of select="."/> 
     </xsl:for-each> 
    </span> 
</xsl:template> 

<xsl:template match="span[@class='a']"/> 

</xsl:stylesheet> 

Mit etwas mehr Arbeit, könnten Sie die interspersing white-space nur Textknoten in der Gruppe enthalten. Sehen Sie sich alternativ eine Technik an, die als "Geschwisterrekursion" bekannt ist.