public JItem mapItem(JItem itemi) { JNodeInfo item = (JNodeInfo)itemi; bool isWhite = item.getNodeKind() == net.sf.saxon.type.Type.TEXT && JWhitespace.isWhite(item.getStringValueCS()); return(isWhite ? null : item); }
/// <summary>Locate and compile a stylesheet identified by an <?xml-stylesheet?> /// processing instruction within a source document. /// </summary> /// <param name="source">The document node of the source document containing the /// xml-stylesheet processing instruction.</param> /// <returns>An <c>XsltExecutable</c> which represents the compiled stylesheet object.</returns> /// <remarks>There are some limitations in the current implementation. The media type /// is ignored, as are the other parameters of the xml-stylesheet instruction. The /// href attribute must either reference an embedded stylesheet within the same /// document or a non-embedded external stylesheet.</remarks> public XsltExecutable CompileAssociatedStylesheet(XdmNode source) { // TODO: lift the restrictions if (source == null || source.NodeKind != XmlNodeType.Document) { throw new ArgumentException("Source must be a document node"); } IEnumerator kids = source.EnumerateAxis(XdmAxis.Child); QName xmlstyle = new QName("", "xml-stylesheet"); while (kids.MoveNext()) { XdmNode n = (XdmNode)kids.Current; if (n.NodeKind == XmlNodeType.ProcessingInstruction && n.NodeName.Equals(xmlstyle)) { // TODO: check the media type String href = JProcInstParser.getPseudoAttribute(n.StringValue, "href"); if (href == null) { throw new DynamicError("xml-stylesheet processing instruction has no href attribute"); } String fragment = null; int hash = href.LastIndexOf('#'); if (hash == 0) { if (href.Length == 1) { throw new DynamicError("Relative URI of '#' is invalid"); } fragment = href.Substring(1); JNodeInfo target = ((JDocumentInfo)source.value).selectID(fragment); XdmNode targetWrapper = null; if (target == null) { // There's a problem here because the Microsoft XML parser doesn't // report id values, so selectID() will never work. We work around that // by looking for an attribute named "id" appearing on an xsl:stylesheet // or xsl:transform element QName qid = new QName("", "id"); IEnumerator en = source.EnumerateAxis(XdmAxis.Descendant); while (en.MoveNext()) { XdmNode x = (XdmNode)en.Current; if (x.NodeKind == XmlNodeType.Element && x.NodeName.Uri == "http://www.w3.org/1999/XSL/Transform" && (x.NodeName.LocalName == "stylesheet" || x.NodeName.LocalName == "transform" && x.GetAttributeValue(qid) == fragment)) { targetWrapper = x; } } } else { targetWrapper = (XdmNode)XdmValue.Wrap(target); } if (targetWrapper == null) { throw new DynamicError("No element with id='" + fragment + "' found"); } return(Compile(targetWrapper)); } else if (hash > 0) { throw new NotImplementedException("href cannot identify an embedded stylesheet in a different document"); } else { Uri uri = new Uri(n.BaseUri, href); return(Compile(uri)); } } } throw new DynamicError("xml-stylesheet processing instruction not found"); }