private spindle.core.dom.Rule generateRule(CtRule cRule) throws ParserException, RuleException {
		String ruleLabel = cRule.getLabel();

		if (null == ruleLabel || "".equals(ruleLabel))
			ruleLabel = TEMP_RULE_LABEL + spindle.core.dom.Theory.formatter.format(ruleCounter++);
		// if ("".equals(ruleLabel)) ruleLabel = TEMP_RULE_LABEL + Theory.formatter.format(ruleCounter++);
		// if (null == ruleLabel) ruleLabel = theory.getUniqueRuleLabel();
		spindle.core.dom.RuleType ruleType = getRuleType_xml(cRule.getRuletype());
		spindle.core.dom.Rule newRule = DomUtilities.getRule(ruleLabel, ruleType);

		String ruleMode = cRule.getMode();
		if (null != ruleMode && !"".equals(ruleMode.trim())) newRule.setMode(new spindle.core.dom.Mode(ruleMode, false));

		CtInterval temporal = cRule.getInterval();
		if (null != temporal) newRule.setTemporal(generateTemporal(temporal));

		CtRuleHeadLiterals headLiterals = cRule.getHead();
		for (CtLiteral cLiteral : headLiterals.getLiteral()) {
			spindle.core.dom.Literal literal = generateLiteral(cLiteral);
			newRule.addHeadLiteral(literal);
		}
		CtRuleBodyLiterals bodyLiterals = cRule.getBody();
		if (null != bodyLiterals) {
			CtLiteral bodyLiteral = bodyLiterals.getLiteral();
			if (null != bodyLiteral) {
				newRule.addBodyLiteral(generateLiteral(bodyLiteral));
			} else {
				CtRuleBodyLiterals.And literals = bodyLiterals.getAnd();
				for (CtLiteral cLiteral : literals.getLiteral()) {
					spindle.core.dom.Literal literal = generateLiteral(cLiteral);
					newRule.addBodyLiteral(literal);
				}
			}
		}
		return newRule;
	}