public Content assemble(ConfigurationContext context) {

    if (xsltConfiguration == null) {
      xsltConfiguration = XsltConfiguration.getDefault();
    }

    if (queryFactory == null && stringQueryFactory == null) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ELEMENT_REQUIRED,
                  context.getElement().getTagName(),
                  "sx:stringable or sx:streamSource");
      throw new ServingXmlException(message);
    }

    if (queryFactory == null) {
      ValueEvaluator valueEvaluator = new StringValueEvaluator(stringQueryFactory);
      queryFactory = new StringStreamSourceFactory(valueEvaluator);
    }
    if (contextDocument == null) {
      contextDocument = new DefaultDocument(xsltConfiguration.getOutputPropertyFactories());
    }
    if (baseUri == null) {
      baseUri = context.getQnameContext().getBase();
    }

    PrefixMap prefixMap = DomHelper.createPrefixMap(context.getElement());

    Content contentFactory =
        new XQueryContent(
            baseUri,
            prefixMap,
            queryFactory,
            contextDocument,
            xsltConfiguration.getOutputPropertyFactories());
    if (parameterDescriptors.length > 0) {
      contentFactory = new ContentPrefilter(contentFactory, parameterDescriptors);
    }
    return contentFactory;
  }
  public MapXmlFactory assemble(ConfigurationContext context) {

    if (elementQname == null || elementQname.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "element");
      throw new ServingXmlException(message);
    }

    try {
      if (xsltConfiguration == null) {
        xsltConfiguration = XsltConfiguration.getDefault();
      }

      NameSubstitutionExpr nameResolver =
          NameSubstitutionExpr.parse(context.getQnameContext(), elementQname);

      StringFactory stringFactory =
          StringFactoryCompiler.fromStringables(context, context.getElement());
      StringFactory[] stringFactories = new StringFactory[] {stringFactory};

      MapXmlFactory rmf =
          new MultipleMapXmlFactory(context.getQnameContext(), xsltConfiguration, childFactories);

      if (sorts.length > 0) {
        Comparator comparator = new SortComparator(sorts);
        rmf = new SortGroupFactory(rmf, comparator);
      }
      Environment env = new Environment(parameterDescriptors, context.getQnameContext());
      MapXmlFactory recordMapFactory =
          new ElementMapFactory(env, nameResolver, stringFactories, rmf);
      return recordMapFactory;
    } catch (ServingXmlException e) {
      throw e.contextualizeMessage(context.getElement().getTagName());
    } catch (Exception e) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ERROR,
                  context.getElement().getTagName(),
                  e.getMessage());
      throw new ServingXmlException(message, e);
    }
  }
  public RecordCombinationFactory assemble(ConfigurationContext context) {
    Environment env = new Environment(parameterDescriptors, context.getQnameContext());

    if (recordTypeName.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "recordType");
      throw new ServingXmlException(message);
    }

    NameSubstitutionExpr recordTypeNameExpr =
        NameSubstitutionExpr.parse(context.getQnameContext(), recordTypeName);

    if (dataRecordTypeFactory == null) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ELEMENT_REQUIRED,
                  context.getElement().getTagName(),
                  "sx:flatRecordType");
      throw new ServingXmlException(message);
    }

    if (repeatingGroupFieldName.isEmpty()) {
      String msg =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "repeatingGroup");
      throw new ServingXmlException(msg);
    }

    String baseUri = context.getQnameContext().getBase();
    XPathBooleanExpressionFactory startTestFactory;
    if (startTest.length() > 0) {
      startTestFactory =
          new XPathBooleanExpressionFactoryImpl(
              context.getQnameContext(),
              startTest,
              xsltConfiguration.getVersion(),
              baseUri,
              xsltConfiguration.getTransformerFactory());
    } else {
      startTestFactory =
          new SimpleXPathBooleanExpressionFactory(XPathBooleanExpression.ALWAYS_TRUE);
    }
    XPathBooleanExpressionFactory endTestFactory;
    if (endTest.length() > 0) {
      endTestFactory =
          new XPathBooleanExpressionFactoryImpl(
              context.getQnameContext(),
              endTest,
              xsltConfiguration.getVersion(),
              baseUri,
              xsltConfiguration.getTransformerFactory());
    } else {
      endTestFactory = startTestFactory;
    }

    GroupRecognizer groupRecognizer =
        new GroupRecognizerImpl(
            env.getQnameContext().getPrefixMap(), startTestFactory, endTestFactory);

    FlatFileOptionsFactory flatFileOptionsFactory = assembleFlatFileOptions(context);

    RecordCombinationFactory recordCompositionFactory =
        new CombineFlatRecordsFactory(
            recordTypeNameExpr,
            repeatingGroupFieldName,
            groupRecognizer,
            dataRecordTypeFactory,
            flatFileOptionsFactory);
    // if (parameterDescriptors.length > 0) {
    //  recordCompositionFactory = new FlatRecordTypeFactoryPrefilter(recordCompositionFactory,
    //                                                         parameterDescriptors);
    // }
    return recordCompositionFactory;
  }