hab / picarecord
Pica+ 记录、字段和子字段的面向对象接口
This package is not auto-updated.
Last update: 2024-09-14 16:29:30 UTC
README
[](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
的字段;具有这种简写的字段指示本地记录的开始。