code: @Nonnull
    public PSSpan readSpanFromXML (@Nonnull final IMicroElement eSpan)
    {
      final PSSpan ret = new PSSpan ();
  
      eSpan.forAllAttributes ( (sNS, sAttrName, sVal) -> {
        final String sAttrValue = _getAttributeValue (sVal);
        if (sAttrName.equals (CSchematronXML.ATTR_CLASS))
          ret.setClazz (sAttrValue);
        else
          ret.addForeignAttribute (sAttrName, sAttrValue);
      });
  
      eSpan.forAllChildren (aSpanChild -> {
        switch (aSpanChild.getType ())
        {
          case TEXT:
            ret.addText (((IMicroText) aSpanChild).getNodeValue ());
            break;
          case ELEMENT:
            final IMicroElement eElement = (IMicroElement) aSpanChild;
            if (CSchematron.NAMESPACE_SCHEMATRON.equals (eElement.getNamespaceURI ()))
            {
              _warn (ret, "Unsupported Schematron element '" + eElement.getLocalName () + "'");
            }
            else
              ret.addForeignElement (eElement.getClone ());
  
            break;
          case COMMENT:
            // Ignore comments
            break;
          default:
            _warn (ret, "Unsupported child node: " + aSpanChild);
        }
      });
      return ret;
    }
docs: Read a &lt;span&gt; element
  
  @param eSpan
  The source micro element. Never <code>null</code>.
  @return The created domain object. May not be <code>null</code>.