private void ReadLinkbaseReference(string ContainingDocumentUri, INode LinkbaseReferenceNode, XbrlFragment containingFragment) { var xlinkNode = new XlinkNode(LinkbaseReferenceNode); if (xlinkNode.IsInRole(XbrlDocument.XbrlCalculationLinkbaseReferenceRoleNamespaceUri) == true) { this.thisLinkbaseDocuments.Add(new CalculationLinkbaseDocument(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } else if (xlinkNode.IsInRole(XbrlDocument.XbrlDefinitionLinkbaseReferenceRoleNamespaceUri) == true) { this.thisLinkbaseDocuments.Add(new DefinitionLinkbaseDocument(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } else if (xlinkNode.IsInRole(XbrlDocument.XbrlLabelLinkbaseReferenceRoleNamespaceUri) == true) { this.thisLinkbaseDocuments.Add(new LabelLinkbaseDocument(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } else if (xlinkNode.IsInRole(XbrlDocument.XbrlPresentationLinkbaseReferenceRoleNamespaceUri) == true) { this.thisLinkbaseDocuments.Add(new PresentationLinkbaseDocument(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } else if (xlinkNode.IsInRole(XbrlDocument.XbrlReferenceLinkbaseReferenceRoleNamespaceUri) == true) { this.thisLinkbaseDocuments.Add(new ReferenceLinkbaseDocument(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } else { // At this point, the role is either not available or not in the list of supported roles. // Attempt to use a factory method to look at the linkbase document and attempt to discover // the correct document type. this.thisLinkbaseDocuments.Add(LinkbaseDocument.Create(ContainingDocumentUri, xlinkNode.Href, containingFragment)); } }
//------------------------------------------------------------------------------------ // Used for when a linkbaseRef element has no "role" attribute and the type of linkbase // document must be discovered. The 331-equivalentRelationships-instance-02.xml // document in the XBRL-CONF-2014-12-10 conformance suite is an example of this need. //------------------------------------------------------------------------------------ internal static LinkbaseDocument Create(string containingDocumentUri, string href, XbrlFragment containingFragment) { var newLinkbaseDocument = new LinkbaseDocument(containingDocumentUri, href, containingFragment); var firstChild = newLinkbaseDocument.thisLinkbaseNode.FirstChild; if (firstChild == null) { throw new NotSupportedException($"Linkbase node has no child nodes in document {href} at URI {containingDocumentUri}."); } string firstChildLocalName = firstChild.LocalName; firstChild = null; newLinkbaseDocument = null; if (firstChildLocalName.Equals("calculationLink")) { return(new CalculationLinkbaseDocument(containingDocumentUri, href, containingFragment)); } if (firstChildLocalName.Equals("definitionLink")) { return(new DefinitionLinkbaseDocument(containingDocumentUri, href, containingFragment)); } if (firstChildLocalName.Equals("labelLink")) { return(new LabelLinkbaseDocument(containingDocumentUri, href, containingFragment)); } if (firstChildLocalName.Equals("presentationLink")) { return(new PresentationLinkbaseDocument(containingDocumentUri, href, containingFragment)); } if (firstChildLocalName.Equals("referenceLink")) { return(new ReferenceLinkbaseDocument(containingDocumentUri, href, containingFragment)); } throw new NotSupportedException($"Linkbase node has unsupported child node with local name {firstChildLocalName} in document {href} at URI {containingDocumentUri}."); }
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------ internal CalculationLink(LinkbaseDocument linkbaseDoc, INode CalculationLinkNode) : base(CalculationLinkNode) { this.Linkbase = linkbaseDoc; this.Locators = new List <Locator>(); this.CalculationArcs = new List <CalculationArc>(); this.SummationConcepts = new List <SummationConcept>(); this.RoleUri = new Uri(this.Role); ReadChildLocators(CalculationLinkNode); ReadChildCalculationArcs(CalculationLinkNode); ResolveLocators(); BuildSummationConcepts(); }
//------------------------------------------------------------------------------- // Searches the given linkbase document, looking for facts that are referenced // in arc roles. //------------------------------------------------------------------------------- private void ValidateFactsReferencedInDefinitionArcRoles(LinkbaseDocument CurrentLinkbaseDocument) { foreach (DefinitionLink CurrentDefinitionLink in CurrentLinkbaseDocument.DefinitionLinks) ValidateFactsReferencedInDefinitionArcRoles(CurrentDefinitionLink); }