回复: 编目前端中阅读器阅读图书后的ISBN号问题.
以下是引用 yctsg 于 2009-10-15 16:39:17 发表的文字:
我馆用的是上海图书馆的书目数据。现在通过阅读器读出来的ISBN是连在一起的数据,中间没有“-”,而连在一起的数据在检索时无法检索,只有手工加上-后,才能正确检索。不知道如何解决直接检索而不要手工加“-”的问题。
贵馆用的是DP2新系统了吧?在“种册窗”的MARC编辑窗中,用CTRL+a组合键,可以调出“选择脚本功能窗”,其中,为ISBN号设置了两种数据自动处理脚本:“规整ISBN-13”和“规整ISBN-10”。这两个功能可以自动为用条码阅读器读出来的ISBN号码自动添加上"-"分隔符(对于2008年前出版的图书,读出来的严格来讲是物品码,需要转换才能算是当时的ISBN号码)。注意,根据“照书实录原则”,如果ISBN是10位的,就选“规整ISBN-10”辅助录入脚本;如果ISBN是13位的,就选“规整ISBN-13”。并不需要你们重复操作——因为DP2系统是完全兼容13位与10位的ISBN号的。
所以,假如你们外来的数据,没有添加"-"分隔符,建议采用上面的ISBN规整功能来完善数据,这样数据显得更地道些。也因为提前加了分隔符,才能在后续环节执行“根据010$a中ISBN号自动生成102$a$b内容”和“根据010$a中ISBN号自动生成210$a$c内容”提供依据。
并且,你说“连在一起的数据在检索时无法检索,只有手工加上-后,才能正确检索”,我不太明白你所描述的现象——因为根据系统已有的设计,在对检索点进行提取时,可以预先设置好检索点加工代码,比如引用停用字表,就会忽略数据或检索词中的停用字,比如"-"等标点符号甚至是词汇等。并且,印象中默认配置的检索点配置文件,是启用了ISBN号这个检索点的停用字表处理配置的,比如以下我节选的配置代码:
<key>
<xpath nstable="">/marc:record/marc:datafield[@tag='011']/marc:subfield[@code='a']</xpath>
<from>ISSN</from>
<table ref="ISSN" />
</key>
<table name="ISSN" id="1" type="issn">
<convert>
<string style="#convertISSN,stopword" stopwordTable="title" />
</convert>
<convertquery>
<string style="#convertISSN,stopword" stopwordTable="title" />
</convertquery>
<caption lang="zh-cn">ISSN</caption>
<caption lang="en">ISSN</caption>
</table>
可以看出,在检索点提取时,convert元素子元素string的style属性值中,有一个stopword参数,意味着启用了停用字表。同时,在检索词转换时,convertquery元素子元素中,也启用了停用字表。也就是说,只要在keys配置文件下部的停用字表内容有"-",检索时就无视这个停用字符了,如下表中的停用字表代码:
<stopword>
<stopwordTable name="title">
<separator>
<t>,</t>
<t>_</t>
<t> </t>
<t>&</t>
<t>.</t>
<t>:</t>
<t>;</t>
<t>!</t>
<t>"</t>
<t>'</t>
<t>-</t>
<t><</t>
<t>></t>
<t>-</t>
<t>,</t>
<t>。</t>
<t>‘</t>
<t>’</t>
<t>“</t>
<t>”</t>
<t>—</t>
</separator>
<word>
<t>the</t>
<t>a</t>
</word>
</stopwordTable>
</stopword>
顺带,你也可以看出,在转换参数中,还有一个以"#"前置符引导的“convertISSN”参数,这个转换参数中是系统内置的,而是允许用户自行在keys配置文件中进行二次开发,从而实现更强大的检索点加工转换功能——我们系统能兼容13位ISBN号与10位ISBN号,就得益于这个二次配置的转换函数,参考示例如下:
public void convertISBN()
{
string isbn = this.InputString;
isbn = isbn.Replace("-", ""); //去除ISBN中的"-"连接符号
isbn = isbn.Replace("—", ""); //为稳妥,去除ISBN中的全角"—"连接符号
if (isbn.Length < 3)
{
this.ResultString = isbn; //如果ISBN不足3位,原样输出
return;
}
string head = isbn.Substring(0, 3); //获得新旧ISBN号的判断依据
if (head == "978")
{
isbn = isbn.Substring(3, isbn.Length - 3);
if (isbn.Length >= 10)
{
isbn = isbn.Substring(0, 9);
}
}
else
{
if (isbn.Length >= 10)
{
isbn = isbn.Substring(0, 9);
}
}
this.ResultString = isbn;
}
所以,请核查你的数据库keys配置文件,是否过于陈旧或被改乱了,导致无法正常处理ISBN号。
可参考附件中的keys配置文件——注意别直接导入附件中的配置文件来替换你实际环境中的同名配置文件喔,虽然这很省事,但因为这些检索点个数与设置有可能与你实际的配置不一样,所以请仔细核对并作调整(增加了检索点,需要刷新数据库定义并重建检索点)