我正在尝试将包含人员的XML文件转换为CSV。
其中一些人拥有相同的身份。
对于那些具有相同ID的人,我试图将他们的名字放在不同的列("变体")中,而不是第一次出现(" title")。
还有一个列名="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
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>
用
。[follow :: column [@name =&#39; id_type_nom&#39;] =&#39; 8&#39;]`
我只得到第一个人的名字,但我还没有成功获得下一个人的名字。
以下是我得到的输出:
"title","variant"
"Giovanni Battista Baliani","Giovanni Battista Baliani"
这是I&#39; m寻找的输出
"title","variant"
"Giovanni Battista Baliani","Giambattista Baliani"
非常感谢,如果有人有线索的话!
答案 0 :(得分:0)
我建议您采用略有不同的方法:
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" </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>