使用XSLT和xsl:for将XML转换为XML



我想用XSLT从另一个XML文件创建一个元数据XML文件。输入-xml看起来像这样:

<TEI>
<teiHeader>
<fileDesc>
<titleStmt>
<author>
<persName>
<surname>Doe</surname>
<forename>Jane</forename>
</persName>
<affiliation>UniversityA</affiliation>
</author>
<author>
<persName>
<surname>Smith</surname>
<forename>John</forename>
</persName>
<affiliation>UniversityB</affiliation>
</author>
</titleStmt>
</fileDesc>
</teiHeader>
</TEI>

我想要创建的输出元数据文件应该如下所示:

<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Smith, Jon</name>
<affiliation>UniversityB</affiliation>
</creator>
</creators>
</metadata>

我使用了一个XSLT样式表,如下所示:

<creators><xsl:for-each select="TEI/teiHeader/fileDesc/titleStmt/author">
<creator>
<name><xsl:value-of select="//surname"/>, <xsl:value-of select="//forename"/></name>
<affiliation><xsl:value-of select="//affiliation"/></affiliation>
</creator></xsl:for-each>
</creators>

但是输出一直是这样的:

<metadata>
<creators>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
<creator>
<name>Doe, Jane</name>
<affiliation>UniversityA</affiliation>
</creator>
</creators>
</metadata>

所以我的问题是:如何循环输入xml,并在单个创建者元素中收集每个作者的姓名和隶属关系?

您的指令:

<xsl:value-of select="//surname"/>

选择整个文档中所有surname元素,并返回第一个元素的值,而与当前上下文无关。

要选择作为当前author的后代的surname元素,您需要执行以下操作:

<xsl:value-of select=".//surname"/>

或者——最好——使用完整的相对路径:

<xsl:value-of select="persName/surname"/>

其他元件也是如此。

相关内容

  • 没有找到相关文章

最新更新