Crear el ejemplo Espacios de nombres XMLNSC

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:

  1. Cree un conjunto de mensajes llamado XMLNSCnamespaceMS. El conjunto de mensajes utiliza el analizador de ejecución XMLNSC.
    1. Abra el asistente Nuevo conjunto de mensajes. Para ello, pulse el botón derecho del ratón en cualquier lugar de la vista Desarrollo de intermediario y, a continuación, pulse Nuevo > Recursos independientes > Conjunto de mensajes.
    2. Establezca XMLNSCnamespaceMS como el Nombre del conjunto de mensajes.
    3. Pulse Finalizar.
    4. Asegúrese de que el dominio de mensajes predeterminado está establecido en XMLNSC.
    5. Cierre el conjunto de mensajes.
  2. Importe los archivos de esquema XML al conjunto de mensajes XMLNSCnamespaceMS. Los archivos de esquema XML contienen definiciones para el mensaje SaleListMessage que se utiliza en muchos de los ejemplos de WebSphere Message Broker.
    1. En la vista Desarrollo de intermediario, expanda el proyecto de conjunto de mensajes CHANGENAMESPACEMS.
    2. Seleccione los archivos siguientes:
      • SampleMessage.xsd
      • SampleMessageNamespace1.xsd
      • SampleMessageNamespace2.xsd
    3. Efectúe una pulsación con el botón derecho del ratón en los archivos seleccionados y pulse Copiar.
    4. Efectúe una pulsación con el botón derecho del ratón en el proyecto de conjunto de mensajes XMLNSCnamespaceMS y pulse Pegar. Los archivos de esquema XML se añaden al conjunto de mensajes XMLNSCnamespaceMS.
  3. Cree archivos de definición de mensajes a partir de los archivos de esquema XML.
    1. Pulse el botón derecho del ratón en SampleMessage.xsd en el proyecto de conjunto de mensajes XMLNSCnamespaceMS y pulse Nuevo > Archivo de definición de mensajes de > Archivo de esquema XML.
    2. Asegúrese de que SampleMessage.xsd esté seleccionado en el asistente Nuevo archivo de definición de mensajes y pulse Siguiente.
    3. Pulse Finalizar.
    4. Repita estos pasos para crear archivos de definición de mensajes a partir de los archivos de esquema XML restantes: SampleMessageNamespace1.xsd y SampleMessageNamespace2.xsd.
  4. Cree el proyecto XMLNSCnamespaceMF de Message Broker.
  5. Cree el flujo de mensajes ADDNAMESPACEMF. Este flujo de mensajes acepta un mensaje de entrada procedente de un nodo MQInput que utiliza el analizador XMLNSC. El mensaje de entrada, llamado SalesListMessage, utiliza espacios de nombres. El flujo de mensajes añade un espacio de nombres al mensaje y genera el mensaje actualizado de un nodo MQOutput.
    1. Pulse el botón derecho del ratón en el proyecto XMLNSCnamespaceMF de Message Broker y pulse Nuevo > Flujo de mensajes.
    2. Establezca Nombre del flujo de mensajes en ADDNAMESPACEMF y pulse Finalizar.
    3. Añada los nodos siguientes al lienzo de flujos de mensajes:
      • 1 nodo MQInput
      • 1 nodo Compute
      • 1 nodo MQOutput
    4. Conecte el terminal Out del nodo MQInput al terminal In del nodo Compute.
    5. Conecte el terminal Out del nodo Compute al terminal In del nodo MQOutput.
    6. Configure las propiedades del nodo, tal como se muestra en la siguiente tabla.

      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


    7. Pulse el botón derecho del ratón en el nodo Compute y pulse Abrir ESQL.
    8. Añada el código ESQL siguiente al principio del archivo ESQL, antes del módulo ADDNAMESPACEMF_Compute. Las funciones ESQL ChangeNamespaceInOutputRoot y ChangeNamespace son utilizadas por todos los flujos de mensajes en el ejemplo.
      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;
      
    9. Codifique el ESQL siguiente para el módulo Main:
      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;
      
    10. Guarde ADDNAMESPACEMF.esql y ADDNAMESPACEMF.msgflow.
  6. Cree el flujo de mensajes CHANGENAMESPACEMF. Este flujo de mensajes acepta un mensaje de entrada procedente de un nodo MQInput que utiliza el analizador XMLNSC. El mensaje de entrada, llamado SalesListMessage, utiliza espacios de nombres. El flujo de mensajes modifica el espacio de nombres que utiliza el mensaje y genera el mensaje actualizado de un nodo MQOutput.
    1. Pulse el botón derecho del ratón en el proyecto XMLNSCnamespaceMF de Message Broker y pulse Nuevo > Flujo de mensajes.
    2. Establezca Nombre del flujo de mensajes en CHANGENAMESPACEMF y pulse Finalizar.
    3. Añada los nodos siguientes al lienzo de flujos de mensajes:
      • 1 nodo MQInput
      • 1 nodo Compute
      • 1 nodo MQOutput
    4. Conecte el terminal Out del nodo MQInput al terminal In del nodo Compute.
    5. Conecte el terminal Out del nodo Compute al terminal In del nodo MQOutput.
    6. Configure las propiedades del nodo, tal como se muestra en la siguiente tabla.

      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


    7. Pulse el botón derecho del ratón en el nodo Compute y pulse Abrir ESQL.
    8. Sustituya el ESQL del módulo CHANGENAMESPACEMF_Compute por el código siguiente:
      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;
      
    9. Guarde CHANGENAMESPACEMF.esql y CHANGENAMESPACEMF.msgflow.
  7. Cree el flujo de mensajes DELETENAMESPACEMF. Este flujo de mensajes acepta un mensaje de entrada procedente de un nodo MQInput que utiliza el analizador XMLNSC. El mensaje de entrada, llamado SalesListMessage, utiliza espacios de nombres. El flujo de mensajes suprime el espacio de nombres utilizado por el mensaje y genera el mensaje actualizado de un nodo MQOutput.
    1. Pulse el botón derecho del ratón en el proyecto XMLNSCnamespaceMF de Message Broker y pulse Nuevo > Flujo de mensajes.
    2. Establezca Nombre del flujo de mensajes en DELETENAMESPACEMF y pulse Finalizar.
    3. Añada los nodos siguientes al lienzo de flujos de mensajes:
      • 1 nodo MQInput
      • 1 nodo Compute
      • 1 nodo MQOutput
    4. Conecte el terminal Out del nodo MQInput al terminal In del nodo Compute.
    5. Conecte el terminal Out del nodo Compute al terminal In del nodo MQOutput.
    6. Configure las propiedades del nodo, tal como se muestra en la siguiente tabla.

      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


    7. Pulse el botón derecho del ratón en el nodo Compute y pulse Abrir ESQL.
    8. Añada el ESQL siguiente entre las sentencias BEGIN y END del módulo DELETENAMESPACEMF_Compute para llamar a la función ChangeNamespaceInOutputRoot:
      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;
    9. Guarde DELETENAMESPACEMF.esql y DELETENAMESPACEMF.msgflow.
  8. Despliegue el proyecto XMLNSCnamespaceMF de Message Broker en un intermediario.
    1. Pulse el botón derecho del ratón en Archivadores de intermediario y pulse Nuevo > Archivador de Message Broker .
    2. Seleccione un Proyecto de servidor y establezca el Nombre de archivo para el archivador de intermediario en XMLNSCnamespace.bar.
    3. Pulse Finalizar.
    4. Añada el proyecto XMLNSCnamespaceMF de Message Broker en XMLNSCnamespace.bar.
    5. Guarde el archivo de archivador de intermediario.
    6. Despliegue el archivo XMLNSCnamespace.bar en un intermediario.

Volver a la página inicial del ejemplo