public static int ScriptMarc21( string strRecPath, string strMARC, out List <NameValueLine> results, out string strError) { strError = ""; results = new List <NameValueLine>(); MarcRecord record = new MarcRecord(strMARC); if (record.ChildNodes.count == 0) { return(0); } string strImageUrl = ScriptUtil.GetCoverImageUrl(strMARC, "LargeImage"); // LargeImage if (string.IsNullOrEmpty(strImageUrl) == false) { results.Add(new NameValueLine("_coverImage", strImageUrl)); } // LC control no. MarcNodeList nodes = record.select("field[@name='010']/subfield[@name='a']"); if (nodes.count > 0) { results.Add(new NameValueLine("LC control no.", nodes[0].Content.Trim())); } // Type of material results.Add(new NameValueLine("Type of material", GetMaterialType(record))); // Personal name MarcNodeList fields = record.select("field[@name='100']"); foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new NameValueLine("Personal name", ConcatSubfields(nodes), "author")); } } // Corporate name fields = record.select("field[@name='110']"); if (fields.count > 0) { results.Add(new NameValueLine("Corporate name", BuildFields(fields))); } // Uniform title fields = record.select("field[@name='240']"); if (fields.count > 0) { results.Add(new NameValueLine("Uniform title", BuildFields(fields))); } // Main title fields = record.select("field[@name='245']"); if (fields.count > 0) { results.Add(new NameValueLine("Main title", BuildFields(fields), "title")); } #if NO foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new OneLine("Main title", ConcatSubfields(nodes))); } } #endif // Portion of title fields = record.select("field[@name='246' and @indicator2='0']"); if (fields.count > 0) { results.Add(new NameValueLine("Portion of title", BuildFields(fields))); } // Spine title fields = record.select("field[@name='246' and @indicator2='8']"); if (fields.count > 0) { results.Add(new NameValueLine("Spine title", BuildFields(fields))); } // Edition fields = record.select("field[@name='250']"); if (fields.count > 0) { results.Add(new NameValueLine("Edition", BuildFields(fields))); } // Published/Created fields = record.select("field[@name='260']"); foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new NameValueLine("Published / Created", ConcatSubfields(nodes), "publisher")); // 附加的空格便于在 HTML 中自然折行 } } // Related names fields = record.select("field[@name='700' or @name='710' or @name='711']"); if (fields.count > 0) { results.Add(new NameValueLine("Related names", BuildFields(fields))); } // Related titles fields = record.select("field[@name='730' or @name='740']"); if (fields.count > 0) { results.Add(new NameValueLine("Related titles", BuildFields(fields))); } // Description fields = record.select("field[@name='300' or @name='362']"); if (fields.count > 0) { results.Add(new NameValueLine("Description", BuildFields(fields))); } // ISBN fields = record.select("field[@name='020']"); if (fields.count > 0) { results.Add(new NameValueLine("ISBN", BuildFields(fields), "isbn")); } // Current frequency fields = record.select("field[@name='310']"); if (fields.count > 0) { results.Add(new NameValueLine("Current frequency", BuildFields(fields))); } // Former title fields = record.select("field[@name='247']"); if (fields.count > 0) { results.Add(new NameValueLine("Former title", BuildFields(fields))); } // Former frequency fields = record.select("field[@name='321']"); if (fields.count > 0) { results.Add(new NameValueLine("Former frequency", BuildFields(fields))); } // Continues fields = record.select("field[@name='780']"); if (fields.count > 0) { results.Add(new NameValueLine("Continues", BuildFields(fields))); } // ISSN MarcNodeList subfields = record.select("field[@name='022']/subfield[@name='a']"); if (subfields.count > 0) { results.Add(new NameValueLine("ISSN", ConcatSubfields(subfields), "issn")); } // Linking ISSN subfields = record.select("field[@name='022']/subfield[@name='l']"); if (subfields.count > 0) { results.Add(new NameValueLine("Linking ISSN", ConcatSubfields(subfields))); } // Invalid LCCN subfields = record.select("field[@name='010']/subfield[@name='z']"); if (subfields.count > 0) { results.Add(new NameValueLine("Invalid LCCN", ConcatSubfields(subfields))); } // Contents fields = record.select("field[@name='505' and @indicator1='0']"); if (fields.count > 0) { results.Add(new NameValueLine("Contents", BuildFields(fields))); } // Partial contents fields = record.select("field[@name='505' and @indicator1='2']"); if (fields.count > 0) { results.Add(new NameValueLine("Partial contents", BuildFields(fields))); } // Computer file info fields = record.select("field[@name='538']"); if (fields.count > 0) { results.Add(new NameValueLine("Computer file info", BuildFields(fields))); } // Notes fields = record.select("field[@name='500' or @name='501' or @name='504' or @name='561' or @name='583' or @name='588' or @name='590']"); if (fields.count > 0) { results.Add(new NameValueLine("Notes", BuildFields(fields))); } // References fields = record.select("field[@name='510']"); if (fields.count > 0) { results.Add(new NameValueLine("References", BuildFields(fields))); } // Additional formats fields = record.select("field[@name='530' or @name='533' or @name='776']"); if (fields.count > 0) { results.Add(new NameValueLine("Additional formats", BuildFields(fields))); } // Subjects fields = record.select("field[@name='600' or @name='610' or @name='630' or @name='650' or @name='651']"); if (fields.count > 0) { results.Add(new NameValueLine("Subjects", BuildSubjects(fields))); } // Form/Genre fields = record.select("field[@name='655']"); if (fields.count > 0) { results.Add(new NameValueLine("Form/Genre", BuildSubjects(fields))); } // Series fields = record.select("field[@name='440' or @name='490' or @name='830']"); if (fields.count > 0) { results.Add(new NameValueLine("Series", BuildFields(fields))); } // LC classification fields = record.select("field[@name='050']"); if (fields.count > 0) { results.Add(new NameValueLine("LC classification", BuildFields(fields))); } #if NO foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new OneLine("LC classification", ConcatSubfields(nodes))); } } #endif // NLM class no. fields = record.select("field[@name='060']"); if (fields.count > 0) { results.Add(new NameValueLine("NLM class no.", BuildFields(fields))); } // Dewey class no. // 不要 $2 fields = record.select("field[@name='082']"); if (fields.count > 0) { results.Add(new NameValueLine("Dewey class no.", BuildFields(fields, "a"))); } // NAL class no. fields = record.select("field[@name='070']"); if (fields.count > 0) { results.Add(new NameValueLine("NAL class no.", BuildFields(fields))); } // National bib no. fields = record.select("field[@name='015']"); if (fields.count > 0) { results.Add(new NameValueLine("National bib no.", BuildFields(fields, "a"))); } // National bib agency no. fields = record.select("field[@name='016']"); if (fields.count > 0) { results.Add(new NameValueLine("National bib agency no.", BuildFields(fields, "a"))); } // LC copy fields = record.select("field[@name='051']"); if (fields.count > 0) { results.Add(new NameValueLine("LC copy", BuildFields(fields))); } // Other system no. fields = record.select("field[@name='035'][subfield[@name='a']]"); if (fields.count > 0) { results.Add(new NameValueLine("Other system no.", BuildFields(fields, "a"))); } #if NO fields = record.select("field[@name='035']"); foreach (MarcNode field in fields) { nodes = field.select("subfield[@name='a']"); if (nodes.count > 0) { results.Add(new OneLine("Other system no.", ConcatSubfields(nodes))); } } #endif // Reproduction no./Source fields = record.select("field[@name='037']"); if (fields.count > 0) { results.Add(new NameValueLine("Reproduction no./Source", BuildFields(fields))); } // Geographic area code fields = record.select("field[@name='043']"); if (fields.count > 0) { results.Add(new NameValueLine("Geographic area code", BuildFields(fields))); } // Quality code fields = record.select("field[@name='042']"); if (fields.count > 0) { results.Add(new NameValueLine("Quality code", BuildFields(fields))); } /* * // Links * fields = record.select("field[@name='856'or @name='859']"); * if (fields.count > 0) * { * results.Add(new NameValueLine("Links", BuildLinks(fields))); * } * */ // Content type fields = record.select("field[@name='336']"); if (fields.count > 0) { results.Add(new NameValueLine("Content type", BuildFields(fields, "a"))); } // Media type fields = record.select("field[@name='337']"); if (fields.count > 0) { results.Add(new NameValueLine("Media type", BuildFields(fields, "a"))); } // Carrier type fields = record.select("field[@name='338']"); if (fields.count > 0) { results.Add(new NameValueLine("Carrier type", BuildFields(fields, "a"))); } fields = record.select("field[@name='856' or @name='859']"); if (fields.count > 0) { string strXml = ScriptUtil.BuildObjectXmlTable(strMARC); if (string.IsNullOrEmpty(strXml) == false) { var line = new NameValueLine("Digital Resource", "", "object"); line.Xml = strXml; results.Add(line); } } return(0); }
/* * https://en.wikipedia.org/wiki/International_Standard_Bibliographic_Description#Structure_of_an_ISBD_record * ISBD Structure * 0: Content form and media type area * 1: Title and statement of responsibility area, consisting of * 1.1 Title proper * 1.2 Parallel title * 1.3 Other title information * 1.4 Statement of responsibility * 2: Edition area * 3: Material or type of resource specific area (e.g., the scale of a map or the numbering of a periodical) * 4: Publication, production, distribution, etc., area * 5: Material description area (e.g., number of pages in a book or number of CDs issued as a unit) * 6: Series area * 7: Notes area * 8: Resource identifier and terms of availability area (e.g., ISBN, ISSN) * * 按照上述结构名称,大项的 type 命名为: * content_form_area * title_area * edition_area * material_specific_area * publication_area * material_description_area * series_area * notes_area * resource_identifier_area * */ // 将书目 XML 转换为 table 格式 // parameters: // strBiblioXml XML记录,或者 MARC 记录 // strSyntax MARC格式 usmarc/unimarc。如果strBiblioXml 第一字符为 '<' 则本参数可以为空 // strStyle 创建风格。例如 "title,author" public int ConvertBiblioXmlToTable( string strBiblioXml, string strSyntax, string strRecPath, string strStyle, XmlElement maps_container, out string strBiblio, out string strError) { strBiblio = ""; strError = ""; int nRet = 0; string strMarc = ""; if (string.IsNullOrEmpty(strBiblioXml) == false && strBiblioXml[0] == '<') { // 如果必要,转换为MARC格式,调用filter // string strOutMarcSyntax = ""; // 将MARCXML格式的xml记录转换为marc机内格式字符串 // parameters: // bWarning ==true, 警告后继续转换,不严格对待错误; = false, 非常严格对待错误,遇到错误后不继续转换 // strMarcSyntax 指示marc语法,如果=="",则自动识别 // strOutMarcSyntax out参数,返回marc,如果strMarcSyntax == "",返回找到marc语法,否则返回与输入参数strMarcSyntax相同的值 nRet = MarcUtil.Xml2Marc(strBiblioXml, true, "", // this.CurMarcSyntax, out strSyntax, out strMarc, out strError); if (nRet == -1) { return(-1); } } else { strMarc = strBiblioXml; } { string strFilterFileName = Path.Combine(this.DataDir, "cfgs/table_" + strSyntax + ".fltx"); if (File.Exists(strFilterFileName) == true) { nRet = this.ConvertBiblioXmlToHtml( strFilterFileName, strBiblioXml, null, strRecPath, strStyle, out strBiblio, out strError); if (nRet == -1) { return(-1); } } else { List <NameValueLine> results = null; if (strSyntax == "usmarc") { nRet = MarcTable.ScriptMarc21( strRecPath, strMarc, strStyle, maps_container, out results, out strError); if (nRet == -1) { return(-1); } } else if (strSyntax == "unimarc") { nRet = MarcTable.ScriptUnimarc( strRecPath, strMarc, strStyle, maps_container, out results, out strError); if (nRet == -1) { return(-1); } } else { strError = "无法识别的 MARC 格式 '" + strSyntax + "'"; return(-1); } strBiblio = NameValueLine.BuildTableXml(results, strStyle); return(0); } } return(0); }
public static int ScriptMarc21( string strRecPath, string strMARC, out List<NameValueLine> results, out string strError) { strError = ""; results = new List<NameValueLine>(); MarcRecord record = new MarcRecord(strMARC); if (record.ChildNodes.count == 0) return 0; string strImageUrl = ScriptUtil.GetCoverImageUrl(strMARC, "LargeImage"); // LargeImage if (string.IsNullOrEmpty(strImageUrl) == false) results.Add(new NameValueLine("_coverImage", strImageUrl)); // LC control no. MarcNodeList nodes = record.select("field[@name='010']/subfield[@name='a']"); if (nodes.count > 0) { results.Add(new NameValueLine("LC control no.", nodes[0].Content.Trim())); } // Type of material results.Add(new NameValueLine("Type of material", GetMaterialType(record))); // Personal name MarcNodeList fields = record.select("field[@name='100']"); foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new NameValueLine("Personal name", ConcatSubfields(nodes))); } } // Corporate name fields = record.select("field[@name='110']"); if (fields.count > 0) { results.Add(new NameValueLine("Corporate name", BuildFields(fields))); } // Uniform title fields = record.select("field[@name='240']"); if (fields.count > 0) { results.Add(new NameValueLine("Uniform title", BuildFields(fields))); } // Main title fields = record.select("field[@name='245']"); if (fields.count > 0) { results.Add(new NameValueLine("Main title", BuildFields(fields), "title")); } #if NO foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new OneLine("Main title", ConcatSubfields(nodes))); } } #endif // Portion of title fields = record.select("field[@name='246' and @indicator2='0']"); if (fields.count > 0) { results.Add(new NameValueLine("Portion of title", BuildFields(fields))); } // Spine title fields = record.select("field[@name='246' and @indicator2='8']"); if (fields.count > 0) { results.Add(new NameValueLine("Spine title", BuildFields(fields))); } // Edition fields = record.select("field[@name='250']"); if (fields.count > 0) { results.Add(new NameValueLine("Edition", BuildFields(fields))); } // Published/Created fields = record.select("field[@name='260']"); foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new NameValueLine("Published / Created", ConcatSubfields(nodes))); // 附加的空格便于在 HTML 中自然折行 } } // Related names fields = record.select("field[@name='700' or @name='710' or @name='711']"); if (fields.count > 0) { results.Add(new NameValueLine("Related names", BuildFields(fields))); } // Related titles fields = record.select("field[@name='730' or @name='740']"); if (fields.count > 0) { results.Add(new NameValueLine("Related titles", BuildFields(fields))); } // Description fields = record.select("field[@name='300' or @name='362']"); if (fields.count > 0) { results.Add(new NameValueLine("Description", BuildFields(fields))); } // ISBN fields = record.select("field[@name='020']"); if (fields.count > 0) { results.Add(new NameValueLine("ISBN", BuildFields(fields))); } // Current frequency fields = record.select("field[@name='310']"); if (fields.count > 0) { results.Add(new NameValueLine("Current frequency", BuildFields(fields))); } // Former title fields = record.select("field[@name='247']"); if (fields.count > 0) { results.Add(new NameValueLine("Former title", BuildFields(fields))); } // Former frequency fields = record.select("field[@name='321']"); if (fields.count > 0) { results.Add(new NameValueLine("Former frequency", BuildFields(fields))); } // Continues fields = record.select("field[@name='780']"); if (fields.count > 0) { results.Add(new NameValueLine("Continues", BuildFields(fields))); } // ISSN MarcNodeList subfields = record.select("field[@name='022']/subfield[@name='a']"); if (subfields.count > 0) { results.Add(new NameValueLine("ISSN", ConcatSubfields(subfields))); } // Linking ISSN subfields = record.select("field[@name='022']/subfield[@name='l']"); if (subfields.count > 0) { results.Add(new NameValueLine("Linking ISSN", ConcatSubfields(subfields))); } // Invalid LCCN subfields = record.select("field[@name='010']/subfield[@name='z']"); if (subfields.count > 0) { results.Add(new NameValueLine("Invalid LCCN", ConcatSubfields(subfields))); } // Contents fields = record.select("field[@name='505' and @indicator1='0']"); if (fields.count > 0) { results.Add(new NameValueLine("Contents", BuildFields(fields))); } // Partial contents fields = record.select("field[@name='505' and @indicator1='2']"); if (fields.count > 0) { results.Add(new NameValueLine("Partial contents", BuildFields(fields))); } // Computer file info fields = record.select("field[@name='538']"); if (fields.count > 0) { results.Add(new NameValueLine("Computer file info", BuildFields(fields))); } // Notes fields = record.select("field[@name='500' or @name='501' or @name='504' or @name='561' or @name='583' or @name='588' or @name='590']"); if (fields.count > 0) { results.Add(new NameValueLine("Notes", BuildFields(fields))); } // References fields = record.select("field[@name='510']"); if (fields.count > 0) { results.Add(new NameValueLine("References", BuildFields(fields))); } // Additional formats fields = record.select("field[@name='530' or @name='533' or @name='776']"); if (fields.count > 0) { results.Add(new NameValueLine("Additional formats", BuildFields(fields))); } // Subjects fields = record.select("field[@name='600' or @name='610' or @name='630' or @name='650' or @name='651']"); if (fields.count > 0) { results.Add(new NameValueLine("Subjects", BuildSubjects(fields))); } // Form/Genre fields = record.select("field[@name='655']"); if (fields.count > 0) { results.Add(new NameValueLine("Form/Genre", BuildSubjects(fields))); } // Series fields = record.select("field[@name='440' or @name='490' or @name='830']"); if (fields.count > 0) { results.Add(new NameValueLine("Series", BuildFields(fields))); } // LC classification fields = record.select("field[@name='050']"); if (fields.count > 0) { results.Add(new NameValueLine("LC classification", BuildFields(fields))); } #if NO foreach (MarcNode field in fields) { nodes = field.select("subfield"); if (nodes.count > 0) { results.Add(new OneLine("LC classification", ConcatSubfields(nodes))); } } #endif // NLM class no. fields = record.select("field[@name='060']"); if (fields.count > 0) { results.Add(new NameValueLine("NLM class no.", BuildFields(fields))); } // Dewey class no. // 不要 $2 fields = record.select("field[@name='082']"); if (fields.count > 0) { results.Add(new NameValueLine("Dewey class no.", BuildFields(fields, "a"))); } // NAL class no. fields = record.select("field[@name='070']"); if (fields.count > 0) { results.Add(new NameValueLine("NAL class no.", BuildFields(fields))); } // National bib no. fields = record.select("field[@name='015']"); if (fields.count > 0) { results.Add(new NameValueLine("National bib no.", BuildFields(fields, "a"))); } // National bib agency no. fields = record.select("field[@name='016']"); if (fields.count > 0) { results.Add(new NameValueLine("National bib agency no.", BuildFields(fields, "a"))); } // LC copy fields = record.select("field[@name='051']"); if (fields.count > 0) { results.Add(new NameValueLine("LC copy", BuildFields(fields))); } // Other system no. fields = record.select("field[@name='035'][subfield[@name='a']]"); if (fields.count > 0) { results.Add(new NameValueLine("Other system no.", BuildFields(fields, "a"))); } #if NO fields = record.select("field[@name='035']"); foreach (MarcNode field in fields) { nodes = field.select("subfield[@name='a']"); if (nodes.count > 0) { results.Add(new OneLine("Other system no.", ConcatSubfields(nodes))); } } #endif // Reproduction no./Source fields = record.select("field[@name='037']"); if (fields.count > 0) { results.Add(new NameValueLine("Reproduction no./Source", BuildFields(fields))); } // Geographic area code fields = record.select("field[@name='043']"); if (fields.count > 0) { results.Add(new NameValueLine("Geographic area code", BuildFields(fields))); } // Quality code fields = record.select("field[@name='042']"); if (fields.count > 0) { results.Add(new NameValueLine("Quality code", BuildFields(fields))); } /* // Links fields = record.select("field[@name='856'or @name='859']"); if (fields.count > 0) { results.Add(new NameValueLine("Links", BuildLinks(fields))); } * */ // Content type fields = record.select("field[@name='336']"); if (fields.count > 0) { results.Add(new NameValueLine("Content type", BuildFields(fields, "a"))); } // Media type fields = record.select("field[@name='337']"); if (fields.count > 0) { results.Add(new NameValueLine("Media type", BuildFields(fields, "a"))); } // Carrier type fields = record.select("field[@name='338']"); if (fields.count > 0) { results.Add(new NameValueLine("Carrier type", BuildFields(fields, "a"))); } fields = record.select("field[@name='856' or @name='859']"); if (fields.count > 0) { string strXml = ScriptUtil.BuildObjectXmlTable(strMARC); if (string.IsNullOrEmpty(strXml) == false) { var line = new NameValueLine("Digital Resource", "", "object"); line.Xml = strXml; results.Add(line); } } return 0; }