/// <summary> /// Преобразование "стандартного" портрета в более удобную форму. Сейчас будем "ваять" html типа комбинации полей и правой колонки /// в раскрытии персоны /// </summary> /// <param name="xtree"></param> /// <returns></returns> private XElement ToPortrait(XElement xtree) { var ph = xtree.Elements("inverse") .Where(i => i.Attribute("prop").Value == "http://fogid.net/o/reflected") .Select(i => i.Element("record")) .Where(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/ground")?.Value == "portrait") .Select(r => r.Element("direct")?.Element("record")) .Where(r1 => r1 != null && r1.Attribute("type").Value == "http://fogid.net/o/photo-doc") .OrderByDescending(r1 => r1.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value) .ToArray() .FirstOrDefault() ; string ph_uri = null; if (ph != null) { ph_uri = ph.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/uri").Value; } string lang = null; int nameind = -1; XElement[] namefields = xtree.Elements("field") .Where(f => f.Attribute("prop").Value == "http://fogid.net/o/name") .Where((f, i) => { string la = f.Attribute("{http://www.w3.org/XML/1998/namespace}lang")?.Value; if (nameind == -1 || la == "ru") { nameind = i; lang = la; } return(true); }) .ToArray(); if (nameind == -1) { nameind = 0; } string fd = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value; string td = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/to-date")?.Value; string desc = xtree.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/description")?.Value; XElement[] titles = xtree.Elements("inverse").Where(i => i.Attribute("prop").Value == "http://fogid.net/o/has-title") .Select(i => i.Element("record")) .OrderBy(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value) .ToArray(); XElement[] works = xtree.Elements("inverse").Where(i => i.Attribute("prop").Value == "http://fogid.net/o/participant") .Select(i => i.Element("record")) .Where(r => r.Element("direct")?.Element("record")? .Elements("field") .FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/org-classification")?.Value == "organization") .OrderBy(r => r.Elements("field").FirstOrDefault(f => f.Attribute("prop").Value == "http://fogid.net/o/from-date")?.Value) .ToArray(); XElement result = new XElement("html", new XElement("head"), new XElement("body", new XElement("div", (ph_uri == null? null : new XElement("img", new XAttribute("src", Url.Content("~/Docs/GetPhoto?s=small&u=" + ph_uri)), new XAttribute("align", "right"))), new XElement("div", namefields[nameind].Value), namefields.Where((f, i) => i != nameind).Select(f => new XElement("div", f.Value)), (fd == null && td == null) ?null: new XElement("div", (fd == null ? "" : StaticObjects.DatePrinted(fd)) + (td == null ? "" : " - " + StaticObjects.DatePrinted(td))), desc == null ? null : new XElement("div", desc), new XElement("div", new XAttribute("style", "background-color:aquamarine;"), titles.Select(r => new XElement("div", StaticObjects.DatePrinted(StaticObjects.GetField(r, "http://fogid.net/o/from-date")), new XElement("span", StaticObjects.GetField(r, "http://fogid.net/o/degree"))))), works.Select(parti => { XElement xorg = parti.Element("direct")?.Element("record"); return(new XElement("div", StaticObjects.GetField(parti, "http://fogid.net/o/from-date"), StaticObjects.GetField(parti, "http://fogid.net/o/role"), xorg == null ? null : StaticObjects.GetField(xorg, "http://fogid.net/o/name"), null)); }), null)), null); return(result); }