XSL <for-each>和&#39; follow-sibling&#39;

时间:2016-05-03 13:42:43

标签: xml xslt

我正在尝试将包含人员的XML文件转换为CSV。 其中一些人拥有相同的身份。 对于那些具有相同ID的人,我试图将他们的名字放在不同的列(&#34;变体&#34;)中,而不是第一次出现(&#34; title&#34;)。 还有一个列名="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"

非常感谢,如果有人有线索的话!

1 个答案:

答案 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"&#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>