hab/picarecord

Pica+ 记录、字段和子字段的面向对象接口

维护者

详细信息

git.sr.ht/~dmaus/pica-record

v1.1.1 2017-01-02 10:15 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:29:30 UTC


README

[![构建状态](https://travis-ci.org/dmj/PicaRecord.svg?branch=master)](https://travis-ci.org/dmj/PicaRecord)

关于

PicaRecord 提供了 Pica+ 记录、字段和子字段的面向对象接口。它不提供读取或写入 Pica+ 记录的手段。要实现这一功能,您需要安装 PicaReader 和 PicaWriter 这两个包,它们可以作为专门的 Composer 包使用。

PicaRecord 版权所有 (c) 2012-2019 by Herzog August Bibliothek Wolfenbüttel,并按照 GNU 通用公共许可证第 3 版发布。

安装

您可以通过 Composer 安装 PicaRecord。

composer require hab/picarecord

用法

记录、字段和子字段

子字段

子字段由 Subfield 类表示。Pica+ 子字段是一个由字母数字字符和字符串值组成的有序对(对)。子字段的代码被认为是不可变的,其值不能为空字符串。

字段

字段由 Field 类表示。Pica+ 字段是子字段的有序列表,部分由两个字段属性标识:字段标签和字段出现次数。这两个属性在实例化时设置,被认为是不可变的。

在下文中,字段简写 指的是由字段标签、一个正斜杠(ASCII 47)和两个表示字段出现次数的数字组成的字符串。例如,字段 021A 的出现次数为 0 的字段简写为 021A/00

检索子字段

Field::getSubfields() 在没有参数的情况下调用时返回一个字段的所有子字段。要检索特定的子字段,您可以传递任意数量的参数,每个参数代表一个子字段代码。如果这样做,返回的数组将按照以下方式构建

返回数组的每个元素对应于参数列表中的一个子字段代码。如果字段具有具有指定代码的子字段,则返回数组的元素包含该子字段。如果字段没有具有指定代码的子字段,则返回数组的元素包含 NULL。要检索具有相同子字段代码的多个子字段,您需要在参数列表中重复子字段代码。参数列表中代码的第一个出现对应于具有指定代码的第一个子字段,第二个出现对应于第二个子字段,依此类推。

因为 Field::getSubfields() 当以子字段代码作为参数调用时返回一个具有已知大小的数组(函数传递给函数的参数数),所以您可以使用 PHP 的 list() 操作来方便地使用它。

示例:要检索 Pica+ 字段 028A/00 中编码的作者的名字和姓氏,您可以按如下方式调用 Field::getSubfields()

list($firstName, $lastName, $personalName) = $field->getSubfields('d', 'a', '5');

操作子字段列表

您可以使用 Field::addSubfield() 将字段添加到子字段列表的末尾。如果子字段已经是子字段列表的一部分,则会抛出 InvalidArgumentException。对于更复杂的字段子字段列表操作,您可以使用 Field::setSubfields() 来替换字段的子字段列表。

可以使用 Field::removeSubfield() 方法删除子字段,该方法仅接受要删除的子字段作为参数,如果字段不包含该子字段,则抛出 InvalidArgumentException 异常。

记录

记录类

PicaRecord 提供了四种记录类型的类,分别是 标题记录权威记录本地记录副本记录。标题、本地和副本记录之间的关系如下:标题记录可以包含零个或多个本地记录。每个本地记录可以包含多达 99 个副本记录。

本地记录可以通过所属图书馆的内部图书馆号(ILN)进行识别,可以通过 TitleRecord::getLocalRecord() 方法检索,该方法返回所有本地记录的数组,或者通过 TitleRecord::getLocalRecordByILN() 方法检索,该方法根据其第一个参数检索单个本地记录。

副本记录包含特定项目(样本)的信息,并通过本地记录中项目编号进行识别。您可以使用 LocalRecord::getCopyRecords()LocalRecord::getLocalRecordByItemNumber() 方法检索包含所有副本记录的数组或指定项目编号的单个副本记录。

所有记录类都实现了两个方法 Record::isEmpty(),该方法在记录为空(不包含任何字段)时返回 TRUE,以及 Record::isValid() 方法,该方法对记录进行初步验证。

选择和删除字段

当不带参数调用 Record::getFields() 时,返回记录的所有字段。如果用正则表达式的主体作为参数调用它,则仅返回与正则表达式匹配的简写字段。

Record::select() 提供了对记录字段的更通用访问。它接受一个谓词函数作为参数,并返回满足谓词的所有字段。谓词函数可以是任何有效的 PHP 回调,它接受一个 Field 作为参数,如果该字段满足谓词,则返回 TRUE,否则返回 FALSE。

Record::delete() 删除匹配谓词函数的所有字段(见上文)。

如果一个记录包含其他记录,即如果一个记录是标题或本地记录,Record::delete()Record::select()Record::getFields() 将对所有字段的记录进行操作,包括包含记录的字段。

将字段追加到记录中

将字段追加到现有记录不像选择或删除字段那样直接。每个记录类在通过 Record::append() 函数向其中追加字段时都有自己的限制。

  • 只能将级别为 0 的字段追加到标题和权威记录中
  • 可以将级别为 1 的字段追加到本地记录中
  • 只能将级别为 2 的字段追加到副本记录中;作为一个额外的限制,字段的 occurrence 值必须等于副本记录的项目编号
记录类append() 中允许的字段级别
TitleRecord级别 0
AuthorityRecord级别 0
LocalRecord级别 1
CopyRecord级别 2

尝试添加与允许级别不同的字段的操作将导致抛出 InvalidArgumentException 异常。

致谢

这个包的大部分内容都离不开对 Jakob Voß 开发的开源 Perl 库 Pica::Record 的源代码的研究,以及我们图书馆编目员的实践经验。

脚注

[1] 例如,标题记录可能包含零个或多个标签为 101@ 且 occurrence 为 00 的字段;具有这种简写的字段指示本地记录的开始。