XSL <for-each> и ‘following-sibling’

Я пытаюсь преобразовать XML-файл, содержащий людей, в CSV.
У некоторых из них одинаковые удостоверения.
Для тех, кто имеет тот же идентификатор, я пытаюсь поместить их имя в другой столбец («вариант»), чем первое появление («название»).
Существует также имя столбца ="id_type_nom"со значением 1для первого вхождения и значением 8для следующих.

Вот как выглядит XML-вход :

<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>

Вот что выглядит как мой XSL сейчас

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 



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>

С

.[далее:: столбец[@name= ‘id_type_nom’] = ‘8’]`

Я получаю только имя первого человека, но мне не удалось получить имя следующего человека.

Вот выход, который я получаю :

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

Вот выход, который я ищу

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

Большое спасибо, если у кого есть ключ!

1 ответ

  1. Я бы предложил вам принять немного другой подход:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    >
    <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>