2016-05-03 7 views
0

Ich versuche, eine XML-Datei mit Personen in CSV zu transformieren. Einige dieser Leute haben die gleiche ID. Für diejenigen, die die gleiche ID haben, versuche ich, ihren Namen in eine andere Spalte ("Variante") als das erste Auftreten ("Titel") zu setzen. Es gibt auch einen Spaltennamen ="id_type_nom" mit einem Wert von 1 für das erste Auftreten und einen Wert von 8 für die nächsten.XSL <for-each> und 'folgende Geschwister'

Hier ist, was die XML-Eingabe wie folgt aussieht:.

<database name="bude"> 
    <table name="noms_personnages"> 
    <column name="nom">Giovanni Battista Baliani</column> 
    <column name="id_personnage">6798</column> 
    <column name="id_type_nom">1</column> 
    </table> 
    <table name="noms_personnages"> 
    <column name="nom">Giambattista Baliani</column> 
    <column name="id_personnage">6798</column> 
    <column name="id_type_nom">8</column> 
    </table> 
</database> 

Hier ist, was jetzt

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
xmlns:tei="http://www.tei-c.org/ns/1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" 
exclude-result-prefixes="xd" 
version="2.0"> 
<xsl:output encoding="UTF-8"/> 
<xsl:strip-space elements="*"/> 



<xsl:template match="/"> 
    <xsl:text>"title","variant" 
    </xsl:text> 
    <xsl:for-each select="//table/column[@name='nom'][following-sibling::column[@name='id_type_nom'] = '1']"> 
     <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>","</xsl:text><xsl:value-of select=".[following::column[@name='id_type_nom'] = '8']"/><xsl:text>" 
     </xsl:text> 
    </xsl:for-each> 
</xsl:template> 

Mit

wie mein XSL sieht [folgende :: column [@ name = 'id_type_nom'] = '8'] `

Ich bekomme nur den Namen der ersten Person, aber es ist mir nicht gelungen, den Namen der nächsten Person zu erhalten.

Hier wird die Ausgabe erhalte ich:

"title","variant" 
"Giovanni Battista Baliani","Giovanni Battista Baliani" 

Hier ist der Ausgang Ich bin für

"title","variant" 
"Giovanni Battista Baliani","Giambattista Baliani" 

Vielen Dank suchen, wenn jemand eine Ahnung hat!

+0

Dies ist verwirrend, besonders, weil Ihr Xslt Beispiel nicht gültig Xslt ist z.B. 'select =". [not (previous :: column = column)] "'. Bitte geben Sie ein funktionierendes Beispiel, erwartete Ausgabe und aktuelle Ausgabe an. –

+0

Was ist die erwartete Ausgabe für Namen mit 2 oder mehr Varianten? Und für Namen ohne Varianten? –

Antwort

0

Ich würde vorschlagen, dass Sie einen etwas anderen Ansatz annehmen:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:key name="variants" match="table[column[@name='id_type_nom']=8]" use="column[@name='id_personnage']" /> 

<xsl:template match="/database"> 
    <xsl:text>"title","variant"&#10;</xsl:text> 
    <xsl:apply-templates select="table[column[@name='id_type_nom']=1]"/> 
</xsl:template> 

<xsl:template match="table"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="column[@name='nom']"/> 
    <xsl:text>"</xsl:text> 
    <xsl:for-each select="key('variants', column[@name='id_personnage'])"> 
     <xsl:text>,"</xsl:text> 
     <xsl:value-of select="column[@name='nom']"/> 
     <xsl:text>"</xsl:text> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 
Verwandte Themen