Index: ccr/trunk/p/C0CXPATH.m
===================================================================
--- ccr/trunk/p/C0CXPATH.m	(revision 531)
+++ ccr/trunk/p/C0CXPATH.m	(revision 532)
@@ -200,5 +200,8 @@
  Q
  ;
-INDEX(IZXML,VDX,NOINX) ; parse the XML in IZXML and produce an XPATH index
+INDEX(IZXML,VDX,NOINX,TEMPLATE) ; parse XML in IZXML and produce an XPATH index
+ ; GPL 7/14/09 OPTIONALLY GENERATE AN XML TEMPLATE IF PASSED BY NAME
+ ; TEMPLATE IS IDENTICAL TO THE PARSED XML LINE BY LINE
+ ; EXCEPT THAT DATA VALUES ARE REPLACED WITH @@XPATH@@ FOR THE XPATH OF THE TAG
  ; GPL 5/24/09 AND OPTIONALLY PRODUCE THE VDX ARRAY PASSED BY NAME
  ; @VDX@("XPATH")=VALUE
@@ -225,4 +228,6 @@
  F I=1:1:LCNT  D  ; PROCESS THE ENTIRE ARRAY
  . S LINE=@IZXML@(I)
+ . I $D(TEMPLATE) D  ;IF TEMPLATE IS REQUESTED
+ . . S @TEMPLATE@(I)=$$CLEAN(LINE) 
  . ;W LINE,!
  . S FOUND=0  ; INTIALIZED FOUND FLAG
@@ -250,4 +255,7 @@
  . . . . S $P(@ZXML@(MDX),"^",3)=CURVAL ; THIRD PIECE
  . . . . I DVDX S @VDX@(MDX)=CURVAL ; FILL IN VDX ARRAY IF REQUESTED
+ . . . . I $D(TEMPLATE) D  ; IF TEMPLATE IS REQUESTED
+ . . . . . S LINE=$$CLEAN(LINE) ; CLEAN OUT CONTROL CHARACTERS
+ . . . . . S @TEMPLATE@(I)=$P(LINE,">",1)_">@@"_MDX_"@@</"_$P(LINE,"</",2)
  . . . D POP("C0CSTK",.TMP) ; REMOVE FROM STACK
  . I FOUND'=1  D  ; THE LINE DOESN'T CONTAIN THE START AND END
@@ -280,4 +288,12 @@
  Q
  ;
+CLEAN(STR) ; extrinsic function; returns string
+ ;; Removes all non printable characters from a string.
+ ;; STR by Value
+ N TR,I
+ F I=0:1:31 S TR=$G(TR)_$C(I)
+ S TR=TR_$C(127)
+ QUIT $TR(STR,TR)
+ ;
 QUERY(IARY,XPATH,OARY)	 ; RETURNS THE XML ARRAY MATCHING THE XPATH EXPRESSION
  ; XPATH IS OF THE FORM "//FIRST/SECOND/THIRD"
@@ -493,11 +509,16 @@
  Q
  ;
-MAP(IXML,INARY,OXML)	   ; SUBSTITUTE MULTIPLE @@X@@ VARS WITH VALUES IN INARY
+MAP(IXML,INARY,OXML) ; SUBSTITUTE MULTIPLE @@X@@ VARS WITH VALUES IN INARY
  ; AND PUT THE RESULTS IN OXML
- I '$D(@IXML@(0)) W "MALFORMED XML PASSED TO MAP",! Q
+ N XCNT
+ I '$D(DEBUG) S DEBUG=0
+ I '$D(IXML) W "MALFORMED XML PASSED TO MAP",! Q
+ I '$D(@IXML@(0)) D  ; INITIALIZE COUNT
+ . S XCNT=$O(@IXML@(""),-1)
+ E  S XCNT=@IXML@(0) ;COUNT
  I $O(@INARY@(""))="" W "EMPTY ARRAY PASSED TO MAP",! Q
  N I,J,TNAM,TVAL,TSTR
- S @OXML@(0)=@IXML@(0) ; TOTAL LINES IN OUTPUT
- F I=1:1:@OXML@(0)  D   ; LOOP THROUGH WHOLE ARRAY
+ S @OXML@(0)=XCNT ; TOTAL LINES IN OUTPUT
+ F I=1:1:XCNT  D   ; LOOP THROUGH WHOLE ARRAY
  . S @OXML@(I)=@IXML@(I) ; COPY THE LINE TO OUTPUT
  . I @OXML@(I)?.E1"@@".E D  ; IS THERE A VARIABLE HERE?
