Index: ccr/trunk/p/C0CXPAT0.m
===================================================================
--- ccr/trunk/p/C0CXPAT0.m	(revision 511)
+++ ccr/trunk/p/C0CXPAT0.m	(revision 512)
@@ -86,6 +86,6 @@
  ;;>>?GXML("//FIRST/SECOND/THIRD")="3^9"
  ;;>>?GXML("//FIRST/SECOND/THIRD/FIFTH")="5^7"
- ;;>>?GXML("//FIRST/SECOND/THIRD/FOURTH")="4^4"
- ;;>>?GXML("//FIRST/SECOND/THIRD/SIXTH")="8^8"
+ ;;>>?GXML("//FIRST/SECOND/THIRD/FOURTH")="4^4^@@DATA1@@"
+ ;;>>?GXML("//FIRST/SECOND/THIRD/SIXTH")="8^8^"
  ;;>>?GXML("//FIRST/SECOND")="2^12"
  ;;>>?GXML("//FIRST")="1^13"
@@ -95,7 +95,7 @@
  ;;>>?GXML("//FIRST/SECOND")="2^12"
  ;;>>?GXML("//FIRST/SECOND/_SECOND")="9^11"
- ;;>>?GXML("//FIRST/SECOND/_SECOND/FOURTH")="10^10"
+ ;;>>?GXML("//FIRST/SECOND/_SECOND/FOURTH")="10^10^DATA3"
  ;;>>?GXML("//FIRST/SECOND/THIRD")="3^8"
- ;;>>?GXML("//FIRST/SECOND/THIRD/FOURTH")="4^7"
+ ;;>>?GXML("//FIRST/SECOND/THIRD/FOURTH")="4^7^DATA1"
  ;;>>?GXML("//FIRST")="1^13"
  ;;><MISSING>
Index: ccr/trunk/p/C0CXPATH.m
===================================================================
--- ccr/trunk/p/C0CXPATH.m	(revision 511)
+++ ccr/trunk/p/C0CXPATH.m	(revision 512)
@@ -83,15 +83,65 @@
  Q CUR
  ;
-INDEX(ZXML)	    ; parse the XML in ZXML and produce an XPATH index
- ; ex. ZXML(FIRST,SECOND,THIRD,FOURTH)=FIRSTLINE^LASTLINE
+XVAL(ISTR) ; EXTRACTS THE VALUE FROM A FRAGMENT OF XML
+ ; <NAME>VALUE</NAME> WILL RETURN VALUE
+ N G
+ S G=$P(ISTR,">",2) ;STRIP OFF <NAME>
+ Q $P(G,"<",1) ; STRIP OFF </NAME> LEAVING VALUE
+ ;
+VDX2VDV(OUTVDV,INVDX) ; CONVERT AN VDX ARRAY TO VDV
+ ; VDX: @INVDX@(XPATH)=VALUE
+ ; VDV: @OUTVDV@(X1X2X3X4)=VALUE
+ ; THE VDV DATANAMES MIGHT BE MORE CONVENIENT FOR USE IN CODE
+ ; AN INDEX IS PROVIDED TO GO BACK TO VDX FOR CONVERSIONS
+ ; @VDV@("XPATH",X1X2X3X4)="XPATH"
+ N ZA,ZI,ZW
+ S ZI=""
+ F  S ZI=$O(@INVDX@(ZI)) Q:ZI=""  D  ;
+ . S ZW=$TR(ZI,"/","") ; ELIMINATE ALL SLASHES - CAMEL CASE VARIABLE NAME
+ . W ZW,!
+ . S @OUTVDV@(ZW)=@INVDX@(ZI)
+ . S @OUTVDV@("XPATH",ZW)=ZI
+ Q
+ ;
+VDX2XPG(OUTXPG,INVDX) ; CONVERT AN VDX ARRAY TO XPD
+ ; VDX: @VDX@(XPATH)=VALUE
+ ; XPG: @(VDX(X1,X2,X3,X4))@=VALUE
+ ; THIS IS A STEP TOWARD GENERATING XML FROM A VDX
+ N ZA,ZI,ZW
+ S ZI=""
+ F  S ZI=$O(@INVDX@(ZI)) Q:ZI=""  D  ;
+ . S ZW=$E(ZI,3,$L(ZI)) ; STRIP OFF INITIAL //
+ . S ZW2=$P(ZW,"/",1)
+ . F ZK=1:1:$L(ZW,"/") D PUSH("ZA",$P(ZW,"/",ZK))
+ . ZWR ZA
+ . S ZW2=ZA(1)
+ . F ZK=2:1:ZA(0) D  ;
+ . . S ZW2=ZW2_""","""_ZA(ZK)
+ . K ZA
+ . S ZW2=""""_ZW2_""""
+ . W ZW2,!
+ . S ZN=OUTXPG_"("_ZW2_")"
+ . S @ZN=@INVDX@(ZI)
+ Q
+ ;
+INDEX(ZXML,VDX)	    ; parse the XML in ZXML and produce an XPATH index
+ ; GPL 5/24/09 AND OPTIONALLY PRODUCE THE VDX ARRAY PASSED BY NAME
+ ; @VDX@("XPATH")=VALUE
+ ; ex. @ZXML@("XPATH")=FIRSTLINE^LASTLINE
  ; WHERE FIRSTLINE AND LASTLINE ARE THE BEGINNING AND ENDING OF THE
  ; XML SECTION
  ; ZXML IS PASSED BY NAME
- N I,LINE,FIRST,LAST,CUR,TMP,MDX,FOUND
+ N I,LINE,FIRST,LAST,CUR,TMP,MDX,FOUND,CURVAL,DVDX,LCNT
  N C0CSTK ; LEAVE OUT FOR DEBUGGING
- I '$D(@ZXML@(0))  D  ; NO XML PASSED
+ I '$D(@ZXML@(0)) D  ; IF COUNT NOT IN NODE 0 COUNT THEM
+ . S I="",LCNT=0
+ . F  S I=$O(@ZXML@(I)) Q:I=""  S LCNT=LCNT+1
+ E  S LCNT=@ZXML@(0) ; LINE COUNT PASSED IN ARRAY
+ I LCNT=0  D  Q  ; NO XML PASSED
  . W "ERROR IN XML FILE",!
+ S DVDX=0 ; DEFAULT DO NOT PRODUCE VDX INDEX
+ I $D(VDX) S DVDX=1 ; IF NAME PASSED, DO VDX
  S C0CSTK(0)=0 ; INITIALIZE STACK
- F I=1:1:@ZXML@(0)  D  ; PROCESS THE ENTIRE ARRAY
+ F I=1:1:LCNT  D  ; PROCESS THE ENTIRE ARRAY
  . S LINE=@ZXML@(I)
  . ;W LINE,!
@@ -112,4 +162,7 @@
  . . . I '$D(@ZXML@(MDX))  D  ; NOT IN THE INDEX, NOT A MULTIPLE
  . . . . S @ZXML@(MDX)=I_"^"_I  ; ADD INDEX ENTRY-FIRST AND LAST
+ . . . . S CURVAL=$$XVAL(LINE) ; VALUE
+ . . . . S $P(@ZXML@(MDX),"^",3)=CURVAL ; THIRD PIECE
+ . . . . I DVDX S @VDX@(MDX)=CURVAL ; FILL IN VDX ARRAY IF REQUESTED
  . . . D POP("C0CSTK",.TMP) ; REMOVE FROM STACK
  . I FOUND'=1  D  ; THE LINE DOESN'T CONTAIN THE START AND END
@@ -138,5 +191,5 @@
  . . . . S @ZXML@(MDX)=I_"^" ; INSERT INTO THE INDEX
  S @ZXML@("INDEXED")=""
- S @ZXML@("//")="1^"_@ZXML@(0) ; ROOT XPATH
+ S @ZXML@("//")="1^"_LCNT ; ROOT XPATH
  Q
  ;
