2 # Extract MARC fields from XML
3 # get_marc_attrs( { marc_xml => doc } )
7 FOR isbn IN xml.findnodes('//*[@tag="020"]/*[@code="a"]');
8 args.isbns.push(isbn.textContent);
10 args.upc = xml.findnodes('//*[@tag="024"]/*[@code="a"]').textContent;
11 args.issn = xml.findnodes('//*[@tag="022"]/*[@code="a"]').textContent;
12 args.title = xml.findnodes('//*[@tag="245"]/*[@code="a"]').textContent;
13 args.author = xml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
14 args.publisher = xml.findnodes('//*[@tag="260"]/*[@code="b"]').textContent;
15 args.pubdate = xml.findnodes('//*[@tag="260"]/*[@code="c"]').textContent;
16 args.summary = xml.findnodes('//*[@tag="520"]/*[@code="a"]').textContent;
17 args.edition = xml.findnodes('//*[@tag="250"]/*[@code="a"]').textContent ||
18 xml.findnodes('//*[@tag="534"]/*[@code="b"]').textContent ||
19 xml.findnodes('//*[@tag="775"]/*[@code="b"]').textContent;
21 '//*[@tag="300"]/*[@code="a" or @code="b" or @code="c" or @code="e"]'
24 FOR p IN phys; phys_content.push(p.textContent); END;
25 args.phys_desc = phys_content.join("");
28 args.marc_cn = xml.findnodes('//*[@tag="092" or @tag="099"]/*').textContent;
31 args.isbn_clean = args.isbn.0.replace('\ .*', '');
37 # we use $9 of ISBN and ISSN as a flag for e-version
38 sfx_isbn = xml.findnodes('//*[@tag="020"]/*[@code="9"]');
40 IF sfx_isbn.textContent == "SFX";
41 my_parent = sfx_isbn.parentNode();
42 sfx_isbn = my_parent.findnodes('./*[@code="a"]');
43 sfx_isbn.replace('-', '');
44 args.resolver_isbn = sfx_isbn.replace('\ .*', '');
48 sfx_issn = xml.findnodes('//*[@tag="022"]/*[@code="9"]');
50 IF sfx_issn.textContent == "SFX";
51 my_parent = sfx_issn.parentNode();
52 sfx_issn = my_parent.findnodes('./*[@code="a"]');
54 sfx_issn.textContent.replace('[^\d\-X]', '')
59 # we snag all issns if no SFX available
60 IF args.issns.size == 0;
61 FOR rawissn IN xml.findnodes('//*[@tag="022"]/*[@code="a"]');
63 rawissn.textContent.replace('[^\d\-X]', '')
68 FOR volume IN xml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]');
70 # Check volume visibility - could push this into XPath
71 vol.label = volume.getAttribute('label');
72 vol.id = volume.getAttribute('id');
73 NEXT IF volume.getAttribute('opac_visible') == 'false';
74 NEXT IF volume.getAttribute('deleted') == 'true';
76 IF vol.label == '##URI##';
77 FOR uri IN volume.findnodes('./*[local-name()="uris"]/*[local-name()="uri"]');
78 res.href = uri.getAttribute('href');
79 res.link = uri.getAttribute('label');
80 res.note = uri.getAttribute('use_restriction');
85 copies = volume.findnodes('./*[local-name()="copies"]/*[local-name()="copy"]');
87 # Check copy visibility
88 cp.deleted = copy.getAttribute('deleted');
89 cp.visible = copy.getAttribute('opac_visible');
90 NEXT IF (cp.deleted == 'true' OR cp.visible == 'false');
92 # Iterate through all of the children to determine visibility
93 FOR node IN cp.childNodes;
94 NEXT IF cp.visible == 'false';
95 vis = node.getAttribute('opac_visible');
96 del = node.getAttribute('deleted');
97 IF vis == 'false' or del == 'true';
102 NEXT IF cp.visible == 'false';
104 loc = copy.findnodes('./*[local-name()="location"]');
105 circlib = copy.findnodes('./*[local-name()="circlib"]');
106 status = copy.findnodes('./*[local-name()="status"]');
110 location => loc.textContent,
111 library => circlib.textContent,
112 status => status.textContent
113 barcode => copy.getAttribute('barcode')
115 args.holdings.push(holding);
120 # Extract the copy count summary
121 count_type = (ctx.is_staff) ? 'staff' : 'public';
122 xpath = '//*[local-name()="counts"]/*[local-name()="count"][@type="' _ count_type _ '"]';
123 FOR node IN xml.findnodes(xpath);
124 args.copy_counts = {};
125 FOR attr IN ['count', 'available', 'unshadow', 'transcendant'];
126 args.copy_counts.$attr = node.getAttribute(attr);
130 # "mattype" == "custom marc format specifier"
131 FOR icon_style IN ['mattype', 'item_type'];
132 node = xml.findnodes(
133 '//*[local-name()="attributes"]/*[local-name()="field"][@name="' _ icon_style _ '"]');
134 IF node AND node.textContent;
135 args.format_label = node.getAttribute('coded-value')
136 args.format_icon = ctx.media_prefix _ '/images/format_icons/' _ icon_style _ '/' _ node.textContent _ '.png';
142 BLOCK get_hold_status;
143 IF hold.hold.status == 4;
145 IF ahr.shelf_expire_time;
146 l('<br/>Expires [_1]',
147 date.format(ctx.parse_datetime(ahr.shelf_expire_time), DATE_FORMAT));
149 ELSIF hold.hold.estimated_wait AND hold.hold.estimated_wait > 0;
150 # estimated wait is delivered as seconds.
151 SET hwait = POSIX.ceil(hold.hold.estimated_wait / 86400);
152 l("Estimated wait: [quant,_1,day,days]", hwait);
153 ELSIF hold.hold.status == 3;
155 ELSIF hold.hold.status < 3;
156 l("Waiting for copy");