Index: ccr/trunk/p/C0CMXML.m
===================================================================
--- ccr/trunk/p/C0CMXML.m	(revision 601)
+++ ccr/trunk/p/C0CMXML.m	(revision 605)
@@ -49,7 +49,11 @@
  S C0CDOCID=$$PARSCCD(C0CXMLIN,"W") W !,"DocID: ",C0CDOCID
  S REDUX="//ClinicalDocument/component/structuredBody"
+ D FINDTID ; FIND THE TEMPLATE IDS
+ D FINDALT ; FIND ALTERNATE TAGS
+ D SETCBK ; SET THE CALLBACK ROUTINE FOR TAGS
  D XPATH(1,"/","GIDX","GARY",,REDUX)
- S C0CDOCID=$$PARSE(C0CXMLIN) W !,"DOCID: ",C0CDOCID  ;CALL REGULAR PARSER
- D XPATH(1,"/","GIDX2","GARY2",,REDUX)
+ D SEPARATE("GARY2","GARY") ; SEPARATE FOR EASIER BROWSING
+ ;S C0CDOCID=$$PARSE(C0CXMLIN) W !,"DOCID: ",C0CDOCID  ;CALL REGULAR PARSER
+ ;D XPATH(1,"/","GIDX2","GARY2",,REDUX)
  Q
  ;
@@ -75,11 +79,13 @@
 	N ZFRST S ZFRST=$$FIRST(ZOID) ; SET FIRST CHILD
 	I ZFRST'=0 D  ; THERE IS A CHILD
+	. N ZNUM
 	. N ZMULT S ZMULT=$$ISMULT(ZFRST) ; IS FIRST CHILD A MULTIPLE
 	. D XPATH(ZFRST,NEWPATH,ZXIDX,ZXPARY,$S(ZMULT:1,1:""),ZREDUX) ; DO THE CHILD
 	N GNXT S GNXT=$$NXTSIB(ZOID)
+	I $$TAG(GNXT)'=$$TAG(ZOID) S ZNUM="" ; RESET COUNTING AFTER MULTIPLES
 	I GNXT'=0 D  ;
 	. N ZMULT S ZMULT=$$ISMULT(GNXT) ; IS THE SIBLING A MULTIPLE?
 	. I (ZNUM="")&(ZMULT) D  ; SIBLING IS FIRST OF MULTIPLES
-	. . S ZNUM=1 ;
+	. . N ZNUM S ZNUM=1 ;
 	. . D XPATH(GNXT,ZPATH,ZXIDX,ZXPARY,ZNUM,ZREDUX) ; DO NEXT SIB
 	. E  D XPATH(GNXT,ZPATH,ZXIDX,ZXPARY,$S(ZNUM>0:ZNUM+1,1:""),ZREDUX) ; DO NEXT SIB
@@ -106,5 +112,11 @@
  ;
 TAG(ZOID)	; RETURNS THE XML TAG FOR THE NODE
-	Q $$NAME^MXMLDOM(C0CDOCID,ZOID)
+	;I ZOID=149 B ;GPLTEST
+	N X,Y
+	S Y=""
+	S X=$G(C0CCBK("TAG")) ;IS THERE A CALLBACK FOR THIS ROUTINE
+	I X'="" X X ; EXECUTE THE CALLBACK, SHOULD SET Y
+	I Y="" S Y=$$NAME^MXMLDOM(C0CDOCID,ZOID)
+	Q Y
 	;
 NXTSIB(ZOID)	; RETURNS THE NEXT SIBLING
@@ -205,4 +217,12 @@
  Q
  ;
+SEPARATE(OUTARY,INARY) ; SEPARATES XPATH VARIABLES ACCORDING TO THEIR
+ ; ROOT ; /Problems/etc/etc goes to @OUTARY@("Problems","/Problems/etc/etc")
+ S ZI=""
+ F  S ZI=$O(@INARY@(ZI)) Q:ZI=""  D  ; FOR EACH ELEMENT OF THE ARRAY
+ . S ZJ=$P(ZI,"/",2) ;
+ . S @OUTARY@(ZJ,ZI)=@INARY@(ZI)
+ Q
+ ;
 FINDTID ; FIND TEMPLATE IDS IN DOM 1
  S C0CDOCID=1
@@ -215,19 +235,51 @@
  . . I $$TAG($$PARENT(ZN))="templateId" D  ; ONLY LOOKING FOR TEMPLATES
  . . . S ZG=$$PARENT($$PARENT(ZN))
+ . . . S ZG2=$$PARENT(ZG) ;COMPONENT THAT HOLDS THIS SECTION
  . . . S CMT=$G(@ZD@(ZG,"X",1))
+ . . . I CMT="" S CMT="?"
  . . . I $$TAG(ZG)="section" D  ;START OF A SECTION
- . . . . S CURSEC=ZG
+ . . . . S CURSEC=$$PARENT(ZG)
  . . . . S SECCMT=$G(@ZD@(CURSEC,"X",1))
+ . . . . I SECCMT="" S SECCMT="?"
+ . . . . S SECTID=$G(@ZD@(ZN,"T",1)) ;SECTION TEMPLATE ID
  . . . S TID=$G(@ZD@(ZN,"T",1)) ;TEMPLATE ID
  . . . I CURSEC'="" D  ; IF WE ARE IN A SECTION
- . . . . S CCDDIR(CURSEC,SECCMT,ZG,$$TAG(ZG),CMT)=TID
- . . . W !,$$TAG(ZG)," ",$G(@ZD@(ZG,"X",1))
+ . . . . S CCDDIR(ZG2,CURSEC,$$TAG(ZG2),CMT,SECCMT)=TID
+ . . . . S DOMMAP(ZG2)=CURSEC_U_$$TAG(ZG2)_U_TID_U_SECTID
+ . . . W !,$$TAG(ZG2)," ",$G(@ZD@(ZG,"X",1))
  . . . W " root ",ZN," ",@ZD@(ZN,"T",1)
+ Q
+ ;
+FINDALT ; PROCESS THE DOMMAP AND FIND THE ALT TAGS FOR COMPONENTS
+ ;
+ S ZI=""
+ F  S ZI=$O(DOMMAP(ZI)) Q:ZI=""  D  ; FOR EACH NODE IN THE MAP
+ . S ZJ=DOMMAP(ZI) ;
+ . S PARNODE=$P(ZJ,U,1) ;PARENT NODE
+ . S TAG=$P(ZJ,U,2) ;THIS TAG
+ . S TID=$P(ZJ,U,3) ;THIS TEMPLATE ID
+ . S PARTID=$P(ZJ,U,4) ;PARENT TEMPLATE ID
+ . S ZIEN=$O(^C0CXDS(178.101,"TID",TID,"")) ;THIS NODE IEN
+ . S PARIEN=$O(^C0CXDS(178.101,"TID",PARTID,"")) ;PARENT NODE IEN
+ . I ZI=PARNODE D  ; IF THIS IS A SECTION NODE
+ . . S ALTTAG=$$GET1^DIQ(178.101,PARIEN_",",.03) ;ALT TAG FIELD FOR PARENT
+ . . S NAME=$$GET1^DIQ(178.101,ZIEN_",",.01) ;NAME OF THIS NODE'S TEMPLATE
+ . . W ZI," ",TAG," ",ALTTAG," ",NAME,!
+ . . S C0CTAGS(ZI)=ALTTAG
+ Q
+ ;
+ALTTAG(NODE) ; SET Y EQUAL TO THE ALT TAG FOUND IN C0CTAGS IF NODE IF FOUND
+ ;
+ S Y=$G(C0CTAGS(NODE))
+ Q
+ ;
+SETCBK ; SET THE TAG CALLBACK FOR XPATH PROCESSSING OF THE CCD
+ S C0CCBK("TAG")="D ALTTAG(ZOID)"
  Q
  ;
 GENXDS(ZD) ; GENERATE THE XDS PROTOTYPE RECORDS FROM A CCDDIR ARRAY
  ; ARRAY ELEMENTS LOOK LIKE:
- ; CCDDIR(1634," Vital signs section template ",1659,"observation"," Result observaion template ")="2.16.840.1.113883.10.20.1.31"
- ;or CCDDIR(section node,sec name, cur node,cur tag,cur name)=templateId
+ ; CCDDIR(1659,1634,"observation"," Result observaion template "," Vital signs section template ")="2.16.840.1.113883.10.20.1.31"
+ ;or CCDDIR(cur node,section node,cur tag,cur name,sec name)=templateId
  S ZF=178.101 ; FILE NUMBER FOR THE C0C XDS PROTOTYPE FILE
  S ZI=$Q(@ZD@("")) ;FIRST ARRAY ELEMENT
@@ -245,4 +297,33 @@
  Q
  ;
+WHRUSD(ZD) ; UPDATE THE C0C XDS FILE WITH WHERE USED DATA FROM
+ ; CCDDIR PASS BY NAME
+ ; ARRAY ELEMENTS LOOK LIKE:
+ ; CCDDIR(1634," Vital signs section template ",1659,"observation"," Result observaion template ")="2.16.840.1.113883.10.20.1.31"
+ ;or CCDDIR(section node,sec name, cur node,cur tag,cur name)=templateId
+ S ZF=178.101 ; FILE NUMBER FOR THE C0C XDS PROTOTYPE FILE
+ S ZSF=178.111 ; WHERE USED SUBFILE OF C0C XDS PROTOTYPE FILE
+ S ZI=$Q(@ZD@("")) ;FIRST ARRAY ELEMENT
+ S DONE=0
+ F  Q:DONE  D  ;
+ . W @ZI
+ . S ZIEN=$O(^C0CXDS(178.101,"TID",@ZI,"")) ; IEN FOR THIS NODE'S TEMPLATE
+ . W " IEN:",ZIEN
+ . S ZJ=$QS(ZI,2)
+ . S ZJ=$E(ZJ,2,$L(ZJ)) ;STRIP THE LEADING SPACE
+ . S ZPIEN=$O(^C0CXDS(178.101,"B",ZJ,"")) ; PARENT IEN
+ . W " PARENT IEN:",ZPIEN
+ . S ZTAG=$QS(ZI,4) ; TAG FOR THIS TEMPLATE
+ . W " TAG:",ZTAG,!
+ . I ZIEN'=ZPIEN D  ; ONLY FOR CHILD TEMPLATES
+ . . S C0CFDA(ZSF,"?+1,"_ZIEN_",",.01)=ZPIEN ; NEW SUBFILE ENTRY WITH PAR PTR
+ . . S C0CFDA(ZSF,"?+1,"_ZIEN_",",1)=ZTAG ; TAG FOR NEW ENTRY
+ . . D UPDIE
+ . ;S C0CFDA(ZF,"?+1,",1)=@ZI
+ . ;D UPDIE
+ . S ZI=$Q(@ZI)
+ . I ZI="" S DONE=1
+ Q
+ ; 
 UPDIE	; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS
  K ZERR
