Index: ccr/trunk/p/C0CXPATH.m
===================================================================
--- ccr/trunk/p/C0CXPATH.m	(revision 512)
+++ ccr/trunk/p/C0CXPATH.m	(revision 513)
@@ -104,5 +104,5 @@
  Q
  ;
-VDX2XPG(OUTXPG,INVDX) ; CONVERT AN VDX ARRAY TO XPD
+VDX2XPG(OUTXPG,INVDX) ; CONVERT AN VDX ARRAY TO XPG
  ; VDX: @VDX@(XPATH)=VALUE
  ; XPG: @(VDX(X1,X2,X3,X4))@=VALUE
@@ -123,4 +123,52 @@
  . S ZN=OUTXPG_"("_ZW2_")"
  . S @ZN=@INVDX@(ZI)
+ Q
+ ;
+XML2XPG(OUTXPG,INXML) ; CONVERT AN XML ARRAY, PASSED BY NAME TO AN XPG ARRAY
+ ; XPG MEANS XPATH GLOBAL AND HAS THE FORM @OUTXPG@("X1","X2","X3")=VALUE
+ ;
+ ;N G1
+ D INDEX(INXML,"G1") ; PRODUCES A VDX ARRAY IN G1
+ D VDX2XPG(OUTXPG,"G1") ; CONVERTS THE VDX ARRAY TO XPG FORM
+ Q
+ ;
+DO
+ D XPG2XML("^GPL2B","^GPL2A")
+ Q
+ ;
+XPG2XML(OUTXML,INXPG,NUM) ;
+ ; OUTPUT XML FROM AN XPG FILE
+ I '$D(NUM) D  ; FIRST TIME THROUGH
+ . K @OUTXML
+ . S NUM=1
+ . S ZA=""
+ S G=INXPG
+ S G=@G I G="" Q  ;
+ F  D  ; S G=$Q(@G) Q:G=""  D  ;
+ . F ZI=1:1:$QL(G) D  ;
+ . . I ZI<$QL(G) D  ;
+ . . . S ZB=$QS(G,ZI)
+ . . . I ZA(ZA(0))'=ZB ZOPEN(ZB)
+ . . . E  ZCLOSE(ZB)
+ . . S ZV=""
+ . . S G2=$QS(G,ZI)
+ . . I ZI=$QL(G) S ZV=@G
+ . . W G2," ",ZV
+ . S G=@G I G="" Q  ;
+ . W !
+ Q
+ ;
+ZOPEN(WHAT)
+ D PUSH("GA",WHAT)
+ D PUSH(OUTXML,"<"_WHAT_">")
+ Q
+ ;
+ZCLOSE(WHAT)
+ D POP("GA",.TMP)
+ D PUSH(OUTXML,"</"_WHAT_">")
+ Q
+ ;
+ZVAL(WHAT,VAL)
+ D PUSH(OUTXML,"<"_WHAT_">"_VAL_"</"_WHAT_">")
  Q
  ;
