如何将 MARC21-xml 转换和过滤为 csv?
How to transform and filter a MARC21-xml into csv?
我有 xml MARC21 格式的文件,如下所示:
(缩减为必要的标签,文件有很多records
,我只缩减为一个)
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
<controlfield tag="001">EntryID01</controlfield>
<datafield tag="100" ind1="1" ind2=" ">
<subfield code="0">PubID01</subfield>
<subfield code="a">Lastname01, Firstname01</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="0">PubID02</subfield>
<subfield code="a">Lastname02, Firstname02</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="a">Lastname03, Firstname03</subfield>
</datafield>
</record>
</collection>
我想要一个包含以下内容的 csv order/output。
Lastname01, Firstname01 | PubID01 | EntryID01
Lastname02, Firstname02 | PubID02 | EntryID01
Lastname03, Firstname03 | NOPUBID | EntryID01
并非所有数据字段都有 PubID 信息 (subfield code="0"
),如果没有给定的 PubID,则应改写为“NOPUBID”。
我的尝试是将 xsltproc
与此 xsl
一起使用:
(我试图先从 tag=100
获取数据;但我也需要从 tag=700
获取数据)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim"
xmlns="http://www.loc.gov/MARC21/slim"
exclude-result-prefixes="marc">
<xsl:output method="text" encoding="UTF-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="marc:controlfield[@tag=001]">
<xsl:value-of select="controlfield"/>
</xsl:template>
<xsl:template match="marc:datafield[@tag=100]">
<xsl:for-each select="record/datafield">
<xsl:value-of select="controlfield"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但我绝望地失败了。任何帮助表示赞赏。
我会做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/marc:collection">
<xsl:for-each select="marc:record">
<xsl:variable name="control" select="marc:controlfield[@tag='001']" />
<xsl:for-each select="marc:datafield[@tag='100' or @tag='700']">
<xsl:value-of select="marc:subfield[@code='a']"/>
<xsl:text> | </xsl:text>
<xsl:variable name="pub" select="marc:subfield[@code='0']"/>
<xsl:choose>
<xsl:when test="$pub">
<xsl:value-of select="$pub"/>
</xsl:when>
<xsl:otherwise>NOPUBID</xsl:otherwise>
</xsl:choose>
<xsl:text> | </xsl:text>
<xsl:value-of select="$control"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我有 xml MARC21 格式的文件,如下所示:
(缩减为必要的标签,文件有很多records
,我只缩减为一个)
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
<controlfield tag="001">EntryID01</controlfield>
<datafield tag="100" ind1="1" ind2=" ">
<subfield code="0">PubID01</subfield>
<subfield code="a">Lastname01, Firstname01</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="0">PubID02</subfield>
<subfield code="a">Lastname02, Firstname02</subfield>
</datafield>
<datafield tag="700" ind1="1" ind2=" ">
<subfield code="a">Lastname03, Firstname03</subfield>
</datafield>
</record>
</collection>
我想要一个包含以下内容的 csv order/output。
Lastname01, Firstname01 | PubID01 | EntryID01
Lastname02, Firstname02 | PubID02 | EntryID01
Lastname03, Firstname03 | NOPUBID | EntryID01
并非所有数据字段都有 PubID 信息 (subfield code="0"
),如果没有给定的 PubID,则应改写为“NOPUBID”。
我的尝试是将 xsltproc
与此 xsl
一起使用:
(我试图先从 tag=100
获取数据;但我也需要从 tag=700
获取数据)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim"
xmlns="http://www.loc.gov/MARC21/slim"
exclude-result-prefixes="marc">
<xsl:output method="text" encoding="UTF-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="marc:controlfield[@tag=001]">
<xsl:value-of select="controlfield"/>
</xsl:template>
<xsl:template match="marc:datafield[@tag=100]">
<xsl:for-each select="record/datafield">
<xsl:value-of select="controlfield"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但我绝望地失败了。任何帮助表示赞赏。
我会做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/marc:collection">
<xsl:for-each select="marc:record">
<xsl:variable name="control" select="marc:controlfield[@tag='001']" />
<xsl:for-each select="marc:datafield[@tag='100' or @tag='700']">
<xsl:value-of select="marc:subfield[@code='a']"/>
<xsl:text> | </xsl:text>
<xsl:variable name="pub" select="marc:subfield[@code='0']"/>
<xsl:choose>
<xsl:when test="$pub">
<xsl:value-of select="$pub"/>
</xsl:when>
<xsl:otherwise>NOPUBID</xsl:otherwise>
</xsl:choose>
<xsl:text> | </xsl:text>
<xsl:value-of select="$control"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>