我正在尝试将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;
请帮忙。
答案 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 </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()/../../../../../..
方法使意图更清晰。