@Nonnull
  public PSSchema readSchemaFromXML (@Nonnull final IMicroElement eSchema) throws SchematronReadException
  {
    ValueEnforcer.notNull (eSchema, "Schema");
    if (!CSchematron.NAMESPACE_SCHEMATRON.equals (eSchema.getNamespaceURI ()))
      throw new SchematronReadException (m_aResource, "The passed element is not an ISO Schematron element!");

    final PSSchema ret = new PSSchema (m_aResource);
    final PSRichGroup aRichGroup = new PSRichGroup ();
    eSchema.forAllAttributes ( (sNS, sAttrName, sVal) -> {
      final String sAttrValue = _getAttributeValue (sVal);
      if (sAttrName.equals (CSchematronXML.ATTR_ID))
        ret.setID (sAttrValue);
      else
        if (sAttrName.equals (CSchematronXML.ATTR_SCHEMA_VERSION))
          ret.setSchemaVersion (sAttrValue);
        else
          if (sAttrName.equals (CSchematronXML.ATTR_DEFAULT_PHASE))
            ret.setDefaultPhase (sAttrValue);
          else
            if (sAttrName.equals (CSchematronXML.ATTR_QUERY_BINDING))
              ret.setQueryBinding (sAttrValue);
            else
              if (PSRichGroup.isRichAttribute (sAttrName))
                _handleRichGroup (sAttrName, sAttrValue, aRichGroup);
              else
                ret.addForeignAttribute (sAttrName, sAttrValue);
    });
    ret.setRich (aRichGroup);

    eSchema.forAllChildElements (eSchemaChild -> {
      if (CSchematron.NAMESPACE_SCHEMATRON.equals (eSchemaChild.getNamespaceURI ()))
      {
        if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_INCLUDE))
          ret.addInclude (readIncludeFromXML (eSchemaChild));
        else
          if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_TITLE))
            ret.setTitle (readTitleFromXML (eSchemaChild));
          else
            if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_NS))
              ret.addNS (readNSFromXML (eSchemaChild));
            else
              if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_P))
              {
                final PSP aP = readPFromXML (eSchemaChild);
                if (ret.hasNoPatterns ())
                  ret.addStartP (aP);
                else
                  ret.addEndP (aP);
              }
              else
                if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_LET))
                  ret.addLet (readLetFromXML (eSchemaChild));
                else
                  if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_PHASE))
                    ret.addPhase (readPhaseFromXML (eSchemaChild));
                  else
                    if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_PATTERN))
                      ret.addPattern (readPatternFromXML (eSchemaChild));
                    else
                      if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_DIAGNOSTICS))
                        ret.setDiagnostics (readDiagnosticsFromXML (eSchemaChild));
                      else
                        _warn (ret, "Unsupported Schematron element '" + eSchemaChild.getLocalName () + "'");
      }
      else
        ret.addForeignElement (eSchemaChild.getClone ());
    });
    return ret;
  }
@Nonnull
  public PSSchema readSchemaFromXML (@Nonnull final IMicroElement eSchema) throws SchematronReadException
  {
    ValueEnforcer.notNull (eSchema, "Schema");
    if (!CSchematron.NAMESPACE_SCHEMATRON.equals (eSchema.getNamespaceURI ()))
      throw new SchematronReadException (m_aResource, "The passed element is not an ISO Schematron element!");

    final PSSchema ret = new PSSchema (m_aResource);
    final PSRichGroup aRichGroup = new PSRichGroup ();
    eSchema.forAllAttributes ( (sNS, sAttrName, sVal) -> {
      final String sAttrValue = _getAttributeValue (sVal);
      if (sAttrName.equals (CSchematronXML.ATTR_ID))
        ret.setID (sAttrValue);
      else
        if (sAttrName.equals (CSchematronXML.ATTR_SCHEMA_VERSION))
          ret.setSchemaVersion (sAttrValue);
        else
          if (sAttrName.equals (CSchematronXML.ATTR_DEFAULT_PHASE))
            ret.setDefaultPhase (sAttrValue);
          else
            if (sAttrName.equals (CSchematronXML.ATTR_QUERY_BINDING))
              ret.setQueryBinding (sAttrValue);
            else
              if (PSRichGroup.isRichAttribute (sAttrName))
                _handleRichGroup (sAttrName, sAttrValue, aRichGroup);
              else
                ret.addForeignAttribute (sAttrName, sAttrValue);
    });
    ret.setRich (aRichGroup);

    eSchema.forAllChildElements (eSchemaChild -> {
      if (CSchematron.NAMESPACE_SCHEMATRON.equals (eSchemaChild.getNamespaceURI ()))
      {
        if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_INCLUDE))
          ret.addInclude (readIncludeFromXML (eSchemaChild));
        else
          if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_TITLE))
            ret.setTitle (readTitleFromXML (eSchemaChild));
          else
            if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_NS))
              ret.addNS (readNSFromXML (eSchemaChild));
            else
              if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_P))
              {
                final PSP aP = readPFromXML (eSchemaChild);
                if (ret.hasNoPatterns ())
                  ret.addStartP (aP);
                else
                  ret.addEndP (aP);
              }
              else
                if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_LET))
                  ret.addLet (readLetFromXML (eSchemaChild));
                else
                  if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_PHASE))
                    ret.addPhase (readPhaseFromXML (eSchemaChild));
                  else
                    if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_PATTERN))
                      ret.addPattern (readPatternFromXML (eSchemaChild));
                    else
                      if (eSchemaChild.getLocalName ().equals (CSchematronXML.ELEMENT_DIAGNOSTICS))
                        ret.setDiagnostics (readDiagnosticsFromXML (eSchemaChild));
                      else
                        _warn (ret, "Unsupported Schematron element '" + eSchemaChild.getLocalName () + "'");
      }
      else
        ret.addForeignElement (eSchemaChild.getClone ());
    });
    return ret;
  }
@ Nonnull public PSSchema readSchemaFromXML ( @ Nonnull final IMicroElement eSchema ) throws SchematronReadException { ValueEnforcer . notNull ( eSchema , "Schema" ) ; if ( ! CSchematron . NAMESPACE_SCHEMATRON . equals ( eSchema . getNamespaceURI ( ) ) ) throw new SchematronReadException ( m_aResource , "The passed element is not an ISO Schematron element!" ) ; final PSSchema ret = new PSSchema ( m_aResource ) ; final PSRichGroup aRichGroup = new PSRichGroup ( ) ; eSchema . forAllAttributes ( ( sNS , sAttrName , sVal ) -> { final String sAttrValue = _getAttributeValue ( sVal ) ; if ( sAttrName . equals ( CSchematronXML . ATTR_ID ) ) ret . setID ( sAttrValue ) ; else if ( sAttrName . equals ( CSchematronXML . ATTR_SCHEMA_VERSION ) ) ret . setSchemaVersion ( sAttrValue ) ; else if ( sAttrName . equals ( CSchematronXML . ATTR_DEFAULT_PHASE ) ) ret . setDefaultPhase ( sAttrValue ) ; else if ( sAttrName . equals ( CSchematronXML . ATTR_QUERY_BINDING ) ) ret . setQueryBinding ( sAttrValue ) ; else if ( PSRichGroup . isRichAttribute ( sAttrName ) ) _handleRichGroup ( sAttrName , sAttrValue , aRichGroup ) ; else ret . addForeignAttribute ( sAttrName , sAttrValue ) ; } ) ; ret . setRich ( aRichGroup ) ; eSchema . forAllChildElements ( eSchemaChild -> { if ( CSchematron . NAMESPACE_SCHEMATRON . equals ( eSchemaChild . getNamespaceURI ( ) ) ) { if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_INCLUDE ) ) ret . addInclude ( readIncludeFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_TITLE ) ) ret . setTitle ( readTitleFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_NS ) ) ret . addNS ( readNSFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_P ) ) { final PSP aP = readPFromXML ( eSchemaChild ) ; if ( ret . hasNoPatterns ( ) ) ret . addStartP ( aP ) ; else ret . addEndP ( aP ) ; } else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_LET ) ) ret . addLet ( readLetFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_PHASE ) ) ret . addPhase ( readPhaseFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_PATTERN ) ) ret . addPattern ( readPatternFromXML ( eSchemaChild ) ) ; else if ( eSchemaChild . getLocalName ( ) . equals ( CSchematronXML . ELEMENT_DIAGNOSTICS ) ) ret . setDiagnostics ( readDiagnosticsFromXML ( eSchemaChild ) ) ; else _warn ( ret , "Unsupported Schematron element '" + eSchemaChild . getLocalName ( ) + "'" ) ; } else ret . addForeignElement ( eSchemaChild . getClone ( ) ) ; } ) ; return ret ; }
Parse the Schematron into a pure Java object. This method makes no
assumptions on the validity of the document!

@param eSchema
The XML element to use. May not be <code>null</code>.
@return The created {@link PSSchema} object or <code>null</code> in case of
<code>null</code> document or a fatal error.
@throws SchematronReadException
If reading fails
Parse the Schematron into a pure Java object . This method makes no assumptions on the validity of the document!