code: @Nonnull
    public PSTitle readTitleFromXML (@Nonnull final IMicroElement eTitle)
    {
      final PSTitle ret = new PSTitle ();
  
      eTitle.forAllAttributes ( (sNS, sAttrName, sVal) -> {
        final String sAttrValue = _getAttributeValue (sVal);
        _warn (ret, "Unsupported attribute '" + sAttrName + "'='" + sAttrValue + "'");
      });
  
      eTitle.forAllChildren (aTitleChild -> {
        switch (aTitleChild.getType ())
        {
          case TEXT:
            ret.addText (((IMicroText) aTitleChild).getNodeValue ());
            break;
          case ELEMENT:
            final IMicroElement eElement = (IMicroElement) aTitleChild;
            if (CSchematron.NAMESPACE_SCHEMATRON.equals (eElement.getNamespaceURI ()))
            {
              final String sLocalName = eElement.getLocalName ();
              if (sLocalName.equals (CSchematronXML.ELEMENT_DIR))
                ret.addDir (readDirFromXML (eElement));
              else
                _warn (ret, "Unsupported Schematron element '" + sLocalName + "'");
            }
            else
              _warn (ret, "Unsupported namespace URI '" + eElement.getNamespaceURI () + "'");
  
            break;
          case COMMENT:
            // Ignore comments
            break;
          default:
            _warn (ret, "Unsupported child node: " + aTitleChild);
        }
      });
      return ret;
    }
docs: Read a &lt;title&gt; element
  
  @param eTitle
  The source micro element. Never <code>null</code>.
  @return The created domain object. May not be <code>null</code>.