/// <summary> /// 把记录中的 880 字段聚集在一起 /// </summary> /// <param name="record">MARC 记录</param> public static void PositionField880s(MarcRecord record) { MarcNodeList fields = record.select("field[@name='880']"); fields.detach(); foreach (MarcField field in fields) { record.ChildNodes.insertSequence(field, InsertSequenceStyle.PreferTail); } }
// 在目标集合中每个元素的DOM位置后面(同级)插入源集合内的元素 // 注1: 如果目标集合为空,则本函数不作任何操作。这样可以防止元素被摘除但没有插入到任何位置 // 注2:将 源 插入到 目标 元素的DOM位置后面。如果源头元素在DOM树上,则先摘除它然后插入到新位置,不是复制。 // 注3: 如果目标集合中包含多于一个元素,则分为多轮插入。第二轮以后插入的对象,是源集合中的对象复制出来的新对象 /// <summary> /// 在目标集合中每个元素的 DOM 位置后面(同级)插入源集合内的元素 /// </summary> /// <param name="source_nodes">源集合</param> /// <param name="target_nodes">目标集合</param> public static void insertAfter( MarcNodeList source_nodes, MarcNodeList target_nodes) { if (source_nodes.count == 0) { return; } if (target_nodes.count == 0) { return; } // record.SelectNodes("field[@name='690']")[0].ChildNodes.after(SUBFLD + "x第一个" + SUBFLD + "z第二个"); if (target_nodes is ChildNodeList) { // 数组框架复制,但其中的元素不是复制而是引用 MarcNodeList temp = new MarcNodeList(); temp.add(target_nodes); target_nodes = temp; } // 先(从原有DOM位置)摘除当前集合内的全部元素 source_nodes.detach(); int i = 0; foreach (MarcNode target_node in target_nodes) { MarcNode target = target_node; foreach (MarcNode source_node in source_nodes) { MarcNode source = source_node; if (i > 0) // 第一轮以后,源对象每个都要复制后插入目标位置 { source = source.clone(); target.after(source); } else { target.after(source); } target = source; // 插入后参考位置要顺延 } i++; } }
/// <summary> /// 在目标集合中每个元素的 DOM 位置前面(同级)插入源集合内的元素 /// </summary> /// <param name="source_nodes">源集合</param> /// <param name="target_nodes">目标集合</param> public static void insertBefore( MarcNodeList source_nodes, MarcNodeList target_nodes) { if (source_nodes.count == 0) { return; } if (target_nodes.count == 0) { return; } if (target_nodes is ChildNodeList) { // 数组框架复制,但其中的元素不是复制而是引用 MarcNodeList temp = new MarcNodeList(); temp.add(target_nodes); target_nodes = temp; } // 先(从原有DOM位置)摘除当前集合内的全部元素 source_nodes.detach(); int i = 0; foreach (MarcNode target_node in target_nodes) { MarcNode target = target_node; foreach (MarcNode source_node in source_nodes) { MarcNode source = source_node; if (i > 0) // 第一轮以后,源对象每个都要复制后插入目标位置 { source = source.clone(); target.before(source); } else { target.before(source); } target = source; // 插入后参考位置要顺延 } i++; } }
// 在目标集合中每个元素的DOM位置 下级开头 插入源集合内的元素 /// <summary> /// 在目标集合中每个元素的 DOM 位置下级开头插入源集合内的元素 /// </summary> /// <param name="source_nodes">源集合</param> /// <param name="target_nodes">目标集合</param> public static void prepend( MarcNodeList source_nodes, MarcNodeList target_nodes) { if (source_nodes.count == 0) { return; } if (target_nodes.count == 0) { return; } // 防范目标集合被动态修改后发生foreach报错 if (target_nodes is ChildNodeList) { // 数组框架复制,但其中的元素不是复制而是引用 MarcNodeList temp = new MarcNodeList(); temp.add(target_nodes); target_nodes = temp; } // 先(从原有DOM位置)摘除当前集合内的全部元素 source_nodes.detach(); int i = 0; foreach (MarcNode target_node in target_nodes) { foreach (MarcNode source_node in source_nodes) { MarcNode source = source_node; if (i > 0) // 第一轮以后,源对象每个都要复制后插入目标位置 { source = source.clone(); target_node.prepend(source); } else { target_node.prepend(source); } } i++; } }