Puede utilizar las instrucciones de este tema para crear el ejemplo Espacios de nombres XMLNSC. De forma alternativa, puede importar el conjunto de mensajes completado y el proyecto de Message Broker para el ejemplo. Debe importar los archivos del ejemplo Espacios de nombres XMLNSC en el espacio de trabajo antes de utilizar las instrucciones para crear el ejemplo.
Para crear el ejemplo Espacios de nombres XMLNSC:
Nodo | Página | Propiedad | Valor |
---|---|---|---|
MQInput | Básicas | Nombre de cola | ADDNAMESPACEMF.IN |
Análisis de mensaje de entrada | Dominio del mensaje | XMLNSC | |
Validación | Validar | Heredar | |
Compute | Validación | Validar | Heredar |
MQOutput | Básicas | Nombre de cola |
ADDNAMESPACEMF.OUT |
CREATE FUNCTION ChangeNamespaceInOutputRoot(In rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER) BEGIN -- -- Hace falta eliminar las declaraciones schemalocation y namespace -- IF newNamespace = '' THEN SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = NULL; DECLARE I1 INTEGER CARDINALITY(rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[]); DECLARE I2 INTEGER 1; WHILE I2 <= I1 DO SET rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[1] = NULL; SET I2 = I2 + 1; END WHILE; ELSE -- -- Es necesario modificar las declaraciones de ubicaciones de esquema y espacio de nombres -- -- La ubicación de esquema de destino puede identificarse en la cabecera MQRF2, -- carpeta <usr>, código <TargetSchemaLocation> -- IF rootNode.(XMLNSC.Element)*[1].*:schemaLocation IS NOT NULL THEN SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = newNamespace; END IF; END IF; -- -- CHECKSIBLING es un distintivo que, cuando está definido como TRUE, garantiza que el bucle WHILE sea -- un MOVE ... NEXTSIBLING incondicional (en lugar de MOVE ... FIRSTCHILD) -- Necesita ser MOVE ... NEXTSIBLING (en lugar de MOVE ... FIRSTCHILD) -- Necesitamos esto cuando subimos un nivel en el árbol... de lo contrario, retrocedemos -- al lugar de donde acabamos de venir -- DECLARE CHECKSIBLING BOOLEAN FALSE; -- -- DEPTH determina cuándo terminar. -- Cada vez que ejecutamos MOVE FIRSTCHILD añadimos 1 a DEPTH -- Cada vez que ejecutamos MOVE PARENT restamos 1 de DEPTH -- MOVE NEXTSIBLING no modifica DEPTH -- El valor inicial es 1, por lo que no se hace nada si DEPTH = 0 -- DECLARE DEPTH INTEGER 1; -- -- Recorrer el árbol de arriba abajo, de izquierda a derecha -- WHILE DEPTH <> 0 DO IF CHECKSIBLING = FALSE THEN MOVE rootNode FirstChild; IF LASTMOVE(rootNode) = TRUE THEN SET DEPTH = DEPTH + 1; CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); ELSE MOVE rootNode NEXTSIBLING; IF LASTMOVE(rootNode) = TRUE THEN CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); SET CHECKSIBLING = FALSE; ELSE SET DEPTH = DEPTH - 1; Move rootNode PARENT; SET CHECKSIBLING = TRUE; END IF; END IF; ELSE MOVE rootNode NEXTSIBLING; IF LASTMOVE(rootNode) = TRUE THEN CALL ChangeNamespace(rootNode, oldNamespace, newNamespace); SET CHECKSIBLING = FALSE; ELSE SET DEPTH = DEPTH - 1; Move rootNode PARENT; SET CHECKSIBLING = TRUE; END IF; END IF; END WHILE; END; CREATE FUNCTION ChangeNamespace(IN rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER) BEGIN -- -- Buscar elementos/atributos con el espacio de nombres de origen -- IF (FIELDTYPE(rootNode) = Name) OR (FIELDTYPE(rootNode) = NameValue) THEN IF FIELDNAMESPACE(rootNode) IN (oldNamespace) THEN -- -- Establecer el nuevo espacio de nombres de destino -- SET rootNode NAMESPACE = newNamespace; -- -- Eliminar cualquier definición de espacio de nombres incorporada -- SET rootNode.(XMLNSC.NamespaceDecl)* = NULL; END IF; END IF; END;
CREATE COMPUTE MODULE ADDNAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE ''; DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com'; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; SI InputRoot.MQRFH2.usr.SourceNamespace NO ES NULO, ENTONCES ESTABLEZCA oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; -- El espacio de nombres de destino se puede especificar dinámicamente en la cabecera MQRFH2. -- La lógica siguiente comprueba si MQRFH2 contiene esta info; de no ser así, -- se suministran valores predeterminados en el flujo de mensajes. IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace; ELSE SET newNamespace = TargetNamespace; END IF; -- Hacer que el árbol de salida sea el mismo que el árbol de entrada. SET OutputRoot.XMLNSC = InputBody; -- Cambiar el espacio de nombres del elemento raíz. DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC.*[<]; CALL ChangeNamespace (rootNode, oldNamespace, newNamespace); -- Como alternativa, se aplican los espacios de nombre también a los elementos locales (anidados). -- DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; -- CALL ChangeNamespace (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;
Nodo | Página | Propiedad | Valor |
---|---|---|---|
MQInput | Básicas | Nombre de cola | CHANGENAMESPACEMF.IN |
Análisis de mensaje de entrada | Dominio del mensaje | XMLNSC | |
Validación | Validar | Contenido y valor | |
Compute | Validación | Validar | Heredar |
MQOutput | Básicas | Nombre de cola |
CHANGENAMESPACEMF.OUT |
CREATE COMPUTE MODULE CHANGENAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com'; DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com'; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN SET oldNamespace = ''; ELSE SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; ELSE SET oldNamespace = SourceNamespace; END IF; -- El espacio de nombres de destino puede especificarse dinámicamente en la cabecera MQRFH2. -- La lógica siguiente comprueba si MQRFH2 contiene esta info; de no ser así, -- se suministran valores predeterminados en el flujo de mensajes. IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.TargetNamespace = 'NONAMESPACE' THEN SET newNamespace = ''; ELSE SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace; END IF; ELSE SET newNamespace = TargetNamespace; END IF; -- Hacer que el árbol de salida sea el mismo que el árbol de entrada. -- Navegaremos por el árbol cambiando cosas según avancemos SET OutputRoot.XMLNSC = InputBody; DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;
Nodo | Página | Propiedad | Valor |
---|---|---|---|
MQInput | Básicas | Nombre de cola | DELETENAMESPACEMF.IN |
Análisis de mensaje de entrada | Dominio del mensaje | XMLNSC | |
Validación | Validar | Contenido y valor | |
Compute | Validación | Validar | Heredar |
MQOutput | Básicas | Nombre de cola |
DELETENAMESPACEMF.OUT |
CREATE COMPUTE MODULE DELETENAMESPACEMF_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com'; DECLARE TargetNamespace NAMESPACE ''; CALL CopyMessageHeaders(); DECLARE oldNamespace CHARACTER ''; DECLARE newNamespace CHARACTER ''; SET oldNamespace = SourceNamespace; SET newNamespace = TargetNamespace; -- El espacio de nombres de destino puede especificarse dinámicamente en la cabecera MQRFH2. -- La lógica siguiente comprueba si MQRFH2 contiene esta info; de no ser así, -- se suministran valores predeterminados en el flujo de mensajes. IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN SET oldNamespace = ''; ELSE SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace; END IF; ELSE SET oldNamespace = SourceNamespace; END IF; -- Hacer que el árbol de salida sea el mismo que el árbol de entrada. -- Navegaremos por el ábol cambiando cosas según avancemos SET OutputRoot.XMLNSC = InputBody; DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC; CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE;