当该类型的元素有多个值时,在XSLT中进行分组

时间:2015-02-23 15:27:30

标签: xml xslt grouping

我正在尝试将XML文件转换为多个CSV文件。每条记录都有这个元素(为了清楚起见被截断)

<TEI>
<teiHeader>
<profileDesc>
<textClass>
<keywords>
<list>
<item>Keyword1</item>
<item>Keyword2</item>
<item>Keyword3</item>
</list>
<keywords>
</textClass>
</profileDesc>
</teiHeader>
</TEI>

我想根据不同的项目值输出不同的CSV文件(这些是特定记录的关键字),所以keyword1.csv keyword2.csv等等。因此,上述内容将出现在三种不同的产出中。我尝试了以下

<xsl:for-each-group select="TEI" group-by="teiHeader/profileDesc/textClass/keywords/list/item">
<xsl:result-document method="text" href="CSV Entries\Keywords\{teiHeader/profileDesc/textClass/keywords/list/item}.csv">
Article ID,Newspaper Title,Newspaper City,Newspaper Province,Newspaper Country,Year,Month,Day,Article Type,Text
<xsl:for-each select="current-group()"> 
[...output material]     
</xsl:for-each>  
</xsl:result-document>
</xsl:for-each-group>

但是,只要记录中的项目有两个值,它就会暂停该过程并表示不能将多个结果文档写入同一个URI&#39;

请帮忙。

1 个答案:

答案 0 :(得分:1)

在我看来,您需要从头到尾接近这一点 - 您需要一个每个不同的关键字,并且相应的输出文件包含来自所有{{1}的数据共享该关键字的元素,因此您的TEI需要for-each-group 关键字,而不是select元素:

TEI

不要被<xsl:for-each-group select="TEI/teiHeader/profileDesc/textClass/keywords/list/item" group-by="."> <xsl:result-document method="text" href="CSV Entries\Keywords\{current-grouping-key()}.csv"> <xsl:text>Article ID,Newspaper Title,Newspaper City,Newspaper Province,Newspaper Country,Year,Month,Day,Article Type,Text&#10;</xsl:text> <xsl:for-each select="current-group()/ancestor::TEI[1]"> [...output material] </xsl:for-each> </xsl:result-document> </xsl:for-each-group> 中的[1]误导 - 它只是引用current-group()/ancestor::TEI[1]步骤,并且要求最近的ancestor:: 当前组中的每个 TEI。路径item将达到相同的目的,但恕我直言current-group()/../../../../../..方法使意图更清晰。