@nodecfdi/cfdi-cleaner
Version:
Librería para limpiar comprobantes fiscales digitales v3.3 y v4.0
38 lines (37 loc) • 2.07 kB
JavaScript
import { NAMESPACE } from '@nodecfdi/cfdi-core';
import { Mixin } from 'ts-mixer';
import CfdiXPath from '#src/internal/cfdi_x_path';
import SchemaLocation from '#src/internal/schema_location';
import XmlAttributeMethods from '#src/mixins/xml_attribute_methods';
import XmlNamespaceMethods from '#src/mixins/xml_namespace_methods';
import { namespaceXsi } from '#src/utils/constants';
export default class MoveSchemaLocationsToRoot extends Mixin(XmlNamespaceMethods, XmlAttributeMethods) {
clean(document) {
const root = document.documentElement;
const xpath = CfdiXPath.createFromDocument(document);
if (!root.hasAttributeNS(namespaceXsi, 'schemaLocation')) {
const namespacesXsi = xpath.queryAttributes('//@*[name()="xmlns:xsi"]');
for (const namespaceXsiAttribute of namespacesXsi) {
/* istanbul ignore else -- For @xmldom/xmldom is always xmlns:xsi but posibly in others not same @preserve */
if (namespaceXsiAttribute.nodeValue === namespaceXsi) {
this.attributeRemove(namespaceXsiAttribute);
}
}
root.setAttributeNS(NAMESPACE.XMLNS, 'xmlns:xsi', namespaceXsi);
root.setAttributeNS(namespaceXsi, 'xsi:schemaLocation', '');
}
const rootAttribute = root.getAttributeNodeNS(namespaceXsi, 'schemaLocation');
const schemaLocation = SchemaLocation.createFromValue(rootAttribute.nodeValue);
const schemaLocationAttributes = xpath.querySchemaLocations();
for (const schemaLocationAttribute of schemaLocationAttributes) {
if (rootAttribute === schemaLocationAttribute) {
continue;
}
const currenSchemaLocation = SchemaLocation.createFromValue(schemaLocationAttribute.nodeValue);
schemaLocation.import(currenSchemaLocation);
this.attributeRemove(schemaLocationAttribute);
}
rootAttribute.nodeValue = schemaLocation.asValue();
rootAttribute.value = schemaLocation.asValue();
}
}