Changeset 1336 for ccr/trunk/p/C0CMXP.m
- Timestamp:
- Jan 4, 2012, 9:39:08 PM (14 years ago)
- File:
-
- 1 edited
-
ccr/trunk/p/C0CMXP.m (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
ccr/trunk/p/C0CMXP.m
r1331 r1336 1 C0CMXP ; GPL - MXML based XPath utilities;12/04/09 17:052 ;;0.1;C0C;nopatch;noreleasedate;Build 383 ;Copyright 2009 George Lilly. Licensed under the terms of the GNU4 ;General Public License See attached copy of the License.5 ;6 ;This program is free software; you can redistribute it and/or modify7 ;it under the terms of the GNU General Public License as published by8 ;the Free Software Foundation; either version 2 of the License, or9 ;(at your option) any later version.10 ;11 ;This program is distributed in the hope that it will be useful,12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 ;GNU General Public License for more details.15 ;16 ;You should have received a copy of the GNU General Public License along17 ;with this program; if not, write to the Free Software Foundation, Inc.,18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.19 ;20 Q21 ;22 INITXPF(ARY) ;INITIAL XML/XPATH FILE ARRAY23 ; DON'T USE THIS ONE ... USE INITFARY^C0CSOAP("FARY") INSTEAD24 D INITFARY^C0CSOAP(ARY) ;25 Q26 S @ARY@("XML FILE NUMBER")=178.10127 S @ARY@("XML SOURCE FIELD")=2.128 S @ARY@("XML TEMPLATE FIELD")=329 S @ARY@("XPATH BINDING SUBFILE")=178.101430 S @ARY@("REDUX FIELD")=2.531 Q32 ;33 SETXPF(ARY) ; SET FILE AND FIELD VARIABLES FROM XPF ARRAY34 ;35 S C0CXPF=@ARY@("XML FILE NUMBER")36 S C0CXFLD=@ARY@("XML")37 S C0CXTFLD=@ARY@("TEMPLATE XML")38 S C0CXPBF=@ARY@("BINDING SUBFILE NUMBER")39 S C0CRDUXF=@ARY@("XPATH REDUCTION STRING")40 Q41 ;42 ADDXP(INARY,TID,FARY) ;ADD XPATH .01 FIELD TO BINDING SUBFILE OF TEMPLATE TID43 I '$D(FARY) D ;44 . S FARY="FARY" ; FILE ARRAY45 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE46 D SETXPF(FARY) ;SET FILE VARIABLES47 N C0CA,C0CB48 S C0CA="" S C0CB=049 F S C0CA=$O(@INARY@(C0CA)) Q:C0CA="" D ; FOR EACH XPATH50 . S C0CB=C0CB+1 ; COUNT OF XPATHS51 . S C0CFDA(C0CXPBF,"?+"_C0CB_","_TID_",",.01)=C0CA52 . D UPDIE ; CREATE THE BINDING SUBFILE FOR THIS XPATH53 Q54 ;55 FIXICD9 ; FIX THE ICD9RESULT XML56 D GETXML("GPL","ICD9RESULT") ; GET SOME BAD XML OUT OF THE FILE57 S ZI=""58 S G=""59 F S ZI=$O(GPL(ZI)) Q:ZI="" D ; FOR EACH LINE60 . S G=G_GPL(ZI) ; MAKE ONE BIG STRING OF XML61 D NORMAL^C0CSOAP("G2","G") ;NO NORMALIZE IT BACK INTO AN ARRAY62 D ADDXML("G2","ICD9RESULT") ; AND PUT IT BACK63 Q64 ADDXML(INXML,TEMPID,INFARY) ;ADD XML TO A TEMPLATE ID TEMPID65 ; INXML IS PASSED BY NAME66 I '$D(INFARY) D ;67 . S INFARY="FARY" ; FILE ARRAY68 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE69 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME70 D SETXPF(INFARY) ;SET FILE VARIABLES71 D WP^DIE(C0CXPF,TEMPID_",",C0CXFLD,,INXML)72 Q73 ;74 ADDTEMP(INXML,TEMPID,INFARY) ;ADD XML TEMPLATE TO TEMPLATE RECORD TEMPID75 ;76 I '$D(INFARY) D ;77 . S INFARY="FARY" ; FILE ARRAY78 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE79 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME80 D SETXPF(INFARY) ;SET FILE VARIABLES81 D WP^DIE(C0CXPF,TEMPID_",",C0CXTFLD,,INXML)82 Q83 ;84 GETXML(OUTXML,TEMPID,INFARY) ;GET THE XML FROM TEMPLATE TEMPID85 ;86 I '$D(INFARY) D ;87 . S INFARY="FARY" ; FILE ARRAY88 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE89 D SETXPF(INFARY) ;SET FILE VARIABLES90 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME91 I $$GET1^DIQ(C0CXPF,TEMPID_",",C0CXFLD,,OUTXML)'=OUTXML D Q ;92 . W "ERROR RETRIEVING TEMPLATE",!93 Q94 ;95 GETTEMP(OUTXML,TEMPID,FARY) ;GET THE TEMPLATE XML FROM TEMPLATE TEMPID96 ;97 I '$D(FARY) D ;98 . S FARY="FARY" ; FILE ARRAY99 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE100 D SETXPF(FARY) ;SET FILE VARIABLES101 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,FARY) ;RESOLVE TEMPLATE NAME102 I $$GET1^DIQ(C0CXPF,TEMPID_",",C0CXTFLD,,OUTXML)'=OUTXML D Q ;103 . W "ERROR RETRIEVING TEMPLATE",!104 Q105 ;106 COPYWP(ZFLD,ZSRCREC,ZDESTREC,ZSRCF,ZDESTF) ; COPIES A WORD PROCESSING FIELD107 ; FROM ONE RECORD TO ANOTHER RECORD108 ; ZFLD IS EITHER A NUMBERIC FIELD OR A NAME IN ZSRCF109 ; ZSRCF IS THE SOURCE FILE, IN FILE REDIRECT FORMAT110 ; IF ZSRCF IS OMMITED, THE DEFAULT C0C XML MISC FILE WILL BE ASSUMED111 ; ZDESTF IS DESTINATION FILE. IF OMMITED, IS ASSUMED TO BE THE SAME112 ; A ZSRCF113 I '$D(ZSRCF) D ;114 . S ZSRCF="ZSRCF"115 . D INITFARY^C0CSOAP(ZSRCF)116 I '$D(ZDESTF) D ;117 . S ZDESTF="ZDESTF"118 . M @ZDESTF=@ZSRCF119 N ZSF,ZDF,ZSFREF,ZDFREF120 S ZSF=@ZSRCF@("XML FILE NUMBER")121 S ZSFREF=$$FILEREF^C0CRNF(ZSF)122 S ZDF=@ZDESTF@("XML FILE NUMBER")123 S ZDFREF=$$FILEREF^C0CRNF(ZDF)124 N ZSIEN,ZDIEN125 S ZSIEN=$O(@ZSFREF@("B",ZSRCREC,""))126 I ZSIEN="" W !,"ERROR SOURCE RECORD NOT FOUND" Q ;127 S ZDIEN=$O(@ZDFREF@("B",ZDESTREC,""))128 I ZDIEN="" W !,"ERROR DESTINATION RECORD NOT FOUND" Q ;129 N ZFLDNUM130 I +ZFLD=0 S ZFLDNUM=@ZSRCF@(ZFLD) ; IF FIELD IS PASSED BY NAME131 E S ZFLDNUM=ZFLD ; IF FIELD IS PASSED BY NUMBER132 N ZWP,ZWPN133 S ZWPN=$$GET1^DIQ(ZSF,ZSIEN_",",ZFLDNUM,,"ZWP") ; GET WP FROM SOURCE134 I ZWPN'="ZWP" W !,"ERROR SOURCE FIELD EMPTY" Q ;135 D WP^DIE(ZDF,ZDIEN_",",ZFLDNUM,,"ZWP") ; PUT WP FIELD TO DEST136 Q137 ;138 COMPILE(TID,UFARY) ; COMPILES AN XML TEMPLATE AND GENERATES XPATH BINDINGS139 ; UFARY IF SPECIFIED WILL REDIRECT THE XML FILE TO USE140 ; INTID IS THE IEN OF THE RECORD TO USE IN THE XML FILE141 ; XML IS PULLED FROM THE "XML" FIELD AND THE COMPILED RESULT PUT142 ; IN THE "XML TEMPLATE" FIELD. ALL XPATHS USED IN THE TEMPLATE143 ; WILL BE POPULATED TO THE XPATH BINDINGS SUBFILE AS .01144 I '$D(UFARY) D ;145 . S UFARY="DEFFARY" ; FILE ARRAY146 . ;D INITXPF("UFARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE147 . D INITFARY^C0CSOAP(UFARY)148 D SETXPF(UFARY) ;SET FILE VARIABLES149 I +TID=0 S INTID=$$RESTID^C0CSOAP(TID,UFARY)150 E S INTID=TID151 ;B152 ;N C0CXML,C0CREDUX,C0CTEMP,C0CIDX153 D GETXML("C0CXML",INTID,UFARY)154 S C0CREDUX=$$GET1^DIQ(C0CXPF,INTID_",",C0CRDUXF,"E") ;XPATH REDUCTION STRING155 D MKTPLATE("C0CTEMP","C0CIDX","C0CXML",C0CREDUX) ; CREATE TEMPLATE AND IDX156 D ADDTEMP("C0CTEMP",INTID,UFARY) ; WRITE THE TEMPLATE TO FILE157 D ADDXP("C0CIDX",INTID,UFARY) ;CREATE XPATH SUBFILE ENTRIES FOR EVERY XPATH158 Q159 ;160 MKTPLATE(OUTT,OUTIDX,INXML,REDUX) ;MAKE A TEMPLATE FROM INXML, RETURNED IN OUTT161 ; BOTH PASSED BY NAME. THE REDUX XPATH REDUCTION STRING IS USED IF PASSED162 ; OUTIDX IS AN ARRAY OF THE XPATHS USED IN MAKING THE TEMPLATE163 ;164 S C0CXLOC=$NA(^TMP("C0CXML",$J))165 K @C0CXLOC166 M @C0CXLOC=@INXML167 S C0CDOCID=$$PARSE^C0CMXML(C0CXLOC,"C0CMKT")168 K @C0CXLOC169 S C0CDOM=$NA(^TMP("MXMLDOM",$J,C0CDOCID))170 ;N GIDX,GIDX2,GARY,GARY2171 I '$D(REDUX) S REDUX=""172 D XPATH^C0CMXML(1,"/","GIDX","GARY",,REDUX)173 D INVERT("GIDX2","GIDX") ;MAKE ARRAY TO LOOK UP XPATH BY NODE174 N ZI,ZD S ZI=""175 F S ZI=$O(@C0CDOM@(ZI)) Q:ZI="" D ; FOR EACH NODE IN THE DOM176 . K ZD ;FOR DATA177 . D DATA^C0CMXML("ZD",ZI) ;SEE IF THERE IS DATA FOR THIS NODE178 . ;I $D(ZD(1)) D ; IF YES179 . I $$FIRST^C0CMXML(ZI)=0 D ; IF THERE ARE NO CHILDREN TO THIS NODE180 . . ;I ZI<3 B ;W !,ZD(1)181 . . K @C0CDOM@(ZI,"T") ; KILL THE DATA182 . . N ZXPATH183 . . S ZXPATH=$G(GIDX2(ZI)) ;FIND AN XPATH FOR THIS NODE184 . . S @C0CDOM@(ZI,"T",1)="@@"_ZXPATH_"@@"185 . . I ZXPATH'="" S @OUTIDX@(ZXPATH)="" ; PASS BACK XPATH USED IN IDX186 D OUTXML^C0CMXML(OUTT,C0CDOCID)187 Q188 ;189 INVERT(OUTX,INX) ;INVERTS AN XPATH INDEX RETURNING @OUTX@(x)=XPath from190 ; @INX@(XPath)=x191 N ZI S ZI=""192 F S ZI=$O(@INX@(ZI)) Q:ZI="" D ;FOR EACH XPATH IN THE INPUT193 . S @OUTX@(@INX@(ZI))=ZI ; SET INVERTED ENTRY194 Q195 ;196 DEMUX(OUTX,INX) ;PARSES XPATH PASSED BY VALUE IN INX TO REMOVE [x] MULTIPLES197 ; RETURNS OUTX: MULTIPLE^SUBMULTIPLE^XPATH198 N ZX,ZY,ZZ,ZZ1,ZMULT,ZSUB199 S (ZMULT,ZSUB)=""200 S ZX=$P(INX,"[",2)201 I ZX'="" D ; THERE IS A [x] MULTIPLE202 . S ZY=$P(INX,"[",1) ;FIRST PART OF XPATH203 . S ZMULT=$P(ZX,"]",1) ; NUMBER OF THE MULTIPLE204 . S ZX=ZY_$P(ZX,"]",2) ; REST OF THE XPATH205 . I $P(ZX,"[",2)'="" D ; A SUB MULTIPLE EXISTS206 . . S ZZ=$P(ZX,"[",1) ; FIRST PART OF XPATH207 . . S ZX=$P(ZX,"[",2) ; DELETE THE [208 . . S ZSUB=$P(ZX,"]",1) ; NUMBER OF THE SUBMULTIPLE209 . . S ZX=ZZ_$P(ZX,"]",2) ; REST OF THE XPATH210 E S ZX=INX ;NO MULTIPLE HERE211 S @OUTX=ZMULT_"^"_ZSUB_"^"_ZX ;RETURN MULTIPLE^SUBMULTIPLE^XPATH212 Q213 ;214 DEMUXARY(OARY,IARY,DEPTH) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO215 ; FORMAT @OARY@(x,variablename) where x is the first multiple216 ; IF DEPTH=2, THE LAST 2 PARTS OF THE XPATH WILL BE USED217 N ZI,ZJ,ZK,ZL,ZM S ZI=""218 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ;219 . D DEMUX^C0CMXP("ZJ",ZI)220 . S ZK=$P(ZJ,"^",3)221 . S ZM=$RE($P($RE(ZK),"/",1))222 . I $G(DEPTH)=2 D ;LAST TWO PARTS OF XPATH USED FOR THE VARIABLE NAME223 . . S ZM=$RE($P($RE(ZK),"/",2))_ZM224 . S ZL=$P(ZJ,"^",1)225 . I ZL="" S ZL=1226 . I $D(@OARY@(ZL,ZM)) D ;IT'S A DUP227 . . S @OARY@(ZL,ZM_"[2]")=@IARY@(ZI)228 . E S @OARY@(ZL,ZM)=@IARY@(ZI)229 Q230 ;231 DEMUX2(OARY,IARY,DEPTH) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO232 ; FORMAT @OARY@(x,variablename) where x is the first multiple233 ; IF DEPTH=2, THE LAST 2 PARTS OF THE XPATH WILL BE USED234 N ZI,ZJ,ZK,ZL,ZM S ZI=""235 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ;236 . D DEMUX^C0CMXP("ZJ",ZI)237 . S ZK=$P(ZJ,"^",3)238 . S ZM=$RE($P($RE(ZK),"/",1))239 . I $G(DEPTH)=2 D ;LAST TWO PARTS OF XPATH USED FOR THE VARIABLE NAME240 . . S ZM=$RE($P($RE(ZK),"/",2))_"."_ZM241 . S ZL=$P(ZJ,"^",1)242 . I ZL="" S ZL=1243 . I $D(@OARY@(ZL,ZM)) D ;IT'S A DUP244 . . S @OARY@(ZL,ZM_"[2]")=@IARY@(ZI)245 . E S @OARY@(ZL,ZM)=@IARY@(ZI)246 Q247 ;248 DEMUXXP1(OARY,IARY) ;IARY IS INCOMING XPATH ARRAY249 ; BOTH IARY AND OARY ARE PASSED BY NAME250 ; RETURNS A SIMPLE XPATH ARRAY WITHOUT MULTIPLES. DUPLICATES ARE REMOVED251 N ZI,ZJ,ZK252 S ZI=""253 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; FOR EACH XPATH IN IARY254 . D DEMUX^C0CMXP("ZJ",ZI)255 . S ZK=$P(ZJ,"^",3) ;THE XPATH256 . S @OARY@(ZK)=@IARY@(ZI) ;THE RESULT. DUPLICATES WILL NOT SHOW257 . ; CAUTION, IF THERE ARE MULTIPLES, ONLY THE DATA FOR THE LAST258 . ; MULTIPLE WILL BE INCLUDED IN THE OUTPUT ARRAY, ASSIGNED TO THE259 . ; COMMON XPATH260 Q261 ;262 DEMUXXP2(OARY,IARY) ; IARY AND OARY ARE PASSED BY NAME263 ; IARY IS AN XPATH ARRAY THAT MAY CONTAIN MULTIPLES264 ; OARY IS THE OUTPUT ARRAY WHERE MULTIPLES ARE RETURNED IN THE FORM265 ; @OARY@(x,Xpath)=data or @OARY@(x,y,Xpath)=data WHERE x AND y ARE266 ; THE MULTIPLES AND Xpath IS THE BASE XPATH WITHOUT [x] AND [y]267 ;268 N ZI,ZJ,ZK,ZX,ZY,ZP269 S ZI=""270 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; FOR EACH INPUT XPATH271 . D DEMUX("ZJ",ZI) ; PULL OUT THE MULTIPLES272 . S ZX=$P(ZJ,"^",1) ;x273 . S ZY=$P(ZJ,"^",2) ;y274 . S ZP=$P(ZJ,"^",3) ;Xpath275 . I ZX="" S ZX=1 ; NO MULTIPLE WILL STORE IN x=1276 . I ZY'="" D ;IS THERE A y?277 . . S @OARY@(ZX,ZY,ZP)=@IARY@(ZI)278 . E D ;NO y279 . . S @OARY@(ZX,ZP)=@IARY@(ZI)280 Q281 ;282 UPDIE ; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS283 K ZERR284 D CLEAN^DILF285 D UPDATE^DIE("","C0CFDA","","ZERR")286 I $D(ZERR) D ;287 . W "ERROR",!288 . ZWR ZERR289 . B290 K C0CFDA291 Q292 ;1 C0CMXP ; GPL - MXML based XPath utilities;12/04/09 17:05 2 ;;0.1;C0C;nopatch;noreleasedate;Build 38 3 ;Copyright 2009 George Lilly. Licensed under the terms of the GNU 4 ;General Public License See attached copy of the License. 5 ; 6 ;This program is free software; you can redistribute it and/or modify 7 ;it under the terms of the GNU General Public License as published by 8 ;the Free Software Foundation; either version 2 of the License, or 9 ;(at your option) any later version. 10 ; 11 ;This program is distributed in the hope that it will be useful, 12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of 13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 ;GNU General Public License for more details. 15 ; 16 ;You should have received a copy of the GNU General Public License along 17 ;with this program; if not, write to the Free Software Foundation, Inc., 18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 ; 20 Q 21 ; 22 INITXPF(ARY) ;INITIAL XML/XPATH FILE ARRAY 23 ; DON'T USE THIS ONE ... USE INITFARY^C0CSOAP("FARY") INSTEAD 24 D INITFARY^C0CSOAP(ARY) ; 25 Q 26 S @ARY@("XML FILE NUMBER")=178.101 27 S @ARY@("XML SOURCE FIELD")=2.1 28 S @ARY@("XML TEMPLATE FIELD")=3 29 S @ARY@("XPATH BINDING SUBFILE")=178.1014 30 S @ARY@("REDUX FIELD")=2.5 31 Q 32 ; 33 SETXPF(ARY) ; SET FILE AND FIELD VARIABLES FROM XPF ARRAY 34 ; 35 S C0CXPF=@ARY@("XML FILE NUMBER") 36 S C0CXFLD=@ARY@("XML") 37 S C0CXTFLD=@ARY@("TEMPLATE XML") 38 S C0CXPBF=@ARY@("BINDING SUBFILE NUMBER") 39 S C0CRDUXF=@ARY@("XPATH REDUCTION STRING") 40 Q 41 ; 42 ADDXP(INARY,TID,FARY) ;ADD XPATH .01 FIELD TO BINDING SUBFILE OF TEMPLATE TID 43 I '$D(FARY) D ; 44 . S FARY="FARY" ; FILE ARRAY 45 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 46 D SETXPF(FARY) ;SET FILE VARIABLES 47 N C0CA,C0CB 48 S C0CA="" S C0CB=0 49 F S C0CA=$O(@INARY@(C0CA)) Q:C0CA="" D ; FOR EACH XPATH 50 . S C0CB=C0CB+1 ; COUNT OF XPATHS 51 . S C0CFDA(C0CXPBF,"?+"_C0CB_","_TID_",",.01)=C0CA 52 . D UPDIE ; CREATE THE BINDING SUBFILE FOR THIS XPATH 53 Q 54 ; 55 FIXICD9 ; FIX THE ICD9RESULT XML 56 D GETXML("GPL","ICD9RESULT") ; GET SOME BAD XML OUT OF THE FILE 57 S ZI="" 58 S G="" 59 F S ZI=$O(GPL(ZI)) Q:ZI="" D ; FOR EACH LINE 60 . S G=G_GPL(ZI) ; MAKE ONE BIG STRING OF XML 61 D NORMAL^C0CSOAP("G2","G") ;NO NORMALIZE IT BACK INTO AN ARRAY 62 D ADDXML("G2","ICD9RESULT") ; AND PUT IT BACK 63 Q 64 ADDXML(INXML,TEMPID,INFARY) ;ADD XML TO A TEMPLATE ID TEMPID 65 ; INXML IS PASSED BY NAME 66 I '$D(INFARY) D ; 67 . S INFARY="FARY" ; FILE ARRAY 68 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 69 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME 70 D SETXPF(INFARY) ;SET FILE VARIABLES 71 D WP^DIE(C0CXPF,TEMPID_",",C0CXFLD,,INXML) 72 Q 73 ; 74 ADDTEMP(INXML,TEMPID,INFARY) ;ADD XML TEMPLATE TO TEMPLATE RECORD TEMPID 75 ; 76 I '$D(INFARY) D ; 77 . S INFARY="FARY" ; FILE ARRAY 78 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 79 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME 80 D SETXPF(INFARY) ;SET FILE VARIABLES 81 D WP^DIE(C0CXPF,TEMPID_",",C0CXTFLD,,INXML) 82 Q 83 ; 84 GETXML(OUTXML,TEMPID,INFARY) ;GET THE XML FROM TEMPLATE TEMPID 85 ; 86 I '$D(INFARY) D ; 87 . S INFARY="FARY" ; FILE ARRAY 88 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 89 D SETXPF(INFARY) ;SET FILE VARIABLES 90 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,INFARY) ;RESOLVE TEMPLATE NAME 91 I $$GET1^DIQ(C0CXPF,TEMPID_",",C0CXFLD,,OUTXML)'=OUTXML D Q ; 92 . W "ERROR RETRIEVING TEMPLATE",! 93 Q 94 ; 95 GETTEMP(OUTXML,TEMPID,FARY) ;GET THE TEMPLATE XML FROM TEMPLATE TEMPID 96 ; 97 I '$D(FARY) D ; 98 . S FARY="FARY" ; FILE ARRAY 99 . D INITXPF("FARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 100 D SETXPF(FARY) ;SET FILE VARIABLES 101 I +TEMPID=0 S TEMPID=$$RESTID^C0CSOAP(TEMPID,FARY) ;RESOLVE TEMPLATE NAME 102 I $$GET1^DIQ(C0CXPF,TEMPID_",",C0CXTFLD,,OUTXML)'=OUTXML D Q ; 103 . W "ERROR RETRIEVING TEMPLATE",! 104 Q 105 ; 106 COPYWP(ZFLD,ZSRCREC,ZDESTREC,ZSRCF,ZDESTF) ; COPIES A WORD PROCESSING FIELD 107 ; FROM ONE RECORD TO ANOTHER RECORD 108 ; ZFLD IS EITHER A NUMBERIC FIELD OR A NAME IN ZSRCF 109 ; ZSRCF IS THE SOURCE FILE, IN FILE REDIRECT FORMAT 110 ; IF ZSRCF IS OMMITED, THE DEFAULT C0C XML MISC FILE WILL BE ASSUMED 111 ; ZDESTF IS DESTINATION FILE. IF OMMITED, IS ASSUMED TO BE THE SAME 112 ; A ZSRCF 113 I '$D(ZSRCF) D ; 114 . S ZSRCF="ZSRCF" 115 . D INITFARY^C0CSOAP(ZSRCF) 116 I '$D(ZDESTF) D ; 117 . S ZDESTF="ZDESTF" 118 . M @ZDESTF=@ZSRCF 119 N ZSF,ZDF,ZSFREF,ZDFREF 120 S ZSF=@ZSRCF@("XML FILE NUMBER") 121 S ZSFREF=$$FILEREF^C0CRNF(ZSF) 122 S ZDF=@ZDESTF@("XML FILE NUMBER") 123 S ZDFREF=$$FILEREF^C0CRNF(ZDF) 124 N ZSIEN,ZDIEN 125 S ZSIEN=$O(@ZSFREF@("B",ZSRCREC,"")) 126 I ZSIEN="" W !,"ERROR SOURCE RECORD NOT FOUND" Q ; 127 S ZDIEN=$O(@ZDFREF@("B",ZDESTREC,"")) 128 I ZDIEN="" W !,"ERROR DESTINATION RECORD NOT FOUND" Q ; 129 N ZFLDNUM 130 I +ZFLD=0 S ZFLDNUM=@ZSRCF@(ZFLD) ; IF FIELD IS PASSED BY NAME 131 E S ZFLDNUM=ZFLD ; IF FIELD IS PASSED BY NUMBER 132 N ZWP,ZWPN 133 S ZWPN=$$GET1^DIQ(ZSF,ZSIEN_",",ZFLDNUM,,"ZWP") ; GET WP FROM SOURCE 134 I ZWPN'="ZWP" W !,"ERROR SOURCE FIELD EMPTY" Q ; 135 D WP^DIE(ZDF,ZDIEN_",",ZFLDNUM,,"ZWP") ; PUT WP FIELD TO DEST 136 Q 137 ; 138 COMPILE(TID,UFARY) ; COMPILES AN XML TEMPLATE AND GENERATES XPATH BINDINGS 139 ; UFARY IF SPECIFIED WILL REDIRECT THE XML FILE TO USE 140 ; INTID IS THE IEN OF THE RECORD TO USE IN THE XML FILE 141 ; XML IS PULLED FROM THE "XML" FIELD AND THE COMPILED RESULT PUT 142 ; IN THE "XML TEMPLATE" FIELD. ALL XPATHS USED IN THE TEMPLATE 143 ; WILL BE POPULATED TO THE XPATH BINDINGS SUBFILE AS .01 144 I '$D(UFARY) D ; 145 . S UFARY="DEFFARY" ; FILE ARRAY 146 . ;D INITXPF("UFARY") ;IF FILE ARRAY NOT PASSED, INITIALIZE 147 . D INITFARY^C0CSOAP(UFARY) 148 D SETXPF(UFARY) ;SET FILE VARIABLES 149 I +TID=0 S INTID=$$RESTID^C0CSOAP(TID,UFARY) 150 E S INTID=TID 151 ;B 152 ;N C0CXML,C0CREDUX,C0CTEMP,C0CIDX 153 D GETXML("C0CXML",INTID,UFARY) 154 S C0CREDUX=$$GET1^DIQ(C0CXPF,INTID_",",C0CRDUXF,"E") ;XPATH REDUCTION STRING 155 D MKTPLATE("C0CTEMP","C0CIDX","C0CXML",C0CREDUX) ; CREATE TEMPLATE AND IDX 156 D ADDTEMP("C0CTEMP",INTID,UFARY) ; WRITE THE TEMPLATE TO FILE 157 D ADDXP("C0CIDX",INTID,UFARY) ;CREATE XPATH SUBFILE ENTRIES FOR EVERY XPATH 158 Q 159 ; 160 MKTPLATE(OUTT,OUTIDX,INXML,REDUX) ;MAKE A TEMPLATE FROM INXML, RETURNED IN OUTT 161 ; BOTH PASSED BY NAME. THE REDUX XPATH REDUCTION STRING IS USED IF PASSED 162 ; OUTIDX IS AN ARRAY OF THE XPATHS USED IN MAKING THE TEMPLATE 163 ; 164 S C0CXLOC=$NA(^TMP("C0CXML",$J)) 165 K @C0CXLOC 166 M @C0CXLOC=@INXML 167 S C0CDOCID=$$PARSE^C0CMXML(C0CXLOC,"C0CMKT") 168 K @C0CXLOC 169 S C0CDOM=$NA(^TMP("MXMLDOM",$J,C0CDOCID)) 170 ;N GIDX,GIDX2,GARY,GARY2 171 I '$D(REDUX) S REDUX="" 172 D XPATH^C0CMXML(1,"/","GIDX","GARY",,REDUX) 173 D INVERT("GIDX2","GIDX") ;MAKE ARRAY TO LOOK UP XPATH BY NODE 174 N ZI,ZD S ZI="" 175 F S ZI=$O(@C0CDOM@(ZI)) Q:ZI="" D ; FOR EACH NODE IN THE DOM 176 . K ZD ;FOR DATA 177 . D DATA^C0CMXML("ZD",ZI) ;SEE IF THERE IS DATA FOR THIS NODE 178 . ;I $D(ZD(1)) D ; IF YES 179 . I $$FIRST^C0CMXML(ZI)=0 D ; IF THERE ARE NO CHILDREN TO THIS NODE 180 . . ;I ZI<3 B ;W !,ZD(1) 181 . . K @C0CDOM@(ZI,"T") ; KILL THE DATA 182 . . N ZXPATH 183 . . S ZXPATH=$G(GIDX2(ZI)) ;FIND AN XPATH FOR THIS NODE 184 . . S @C0CDOM@(ZI,"T",1)="@@"_ZXPATH_"@@" 185 . . I ZXPATH'="" S @OUTIDX@(ZXPATH)="" ; PASS BACK XPATH USED IN IDX 186 D OUTXML^C0CMXML(OUTT,C0CDOCID) 187 Q 188 ; 189 INVERT(OUTX,INX) ;INVERTS AN XPATH INDEX RETURNING @OUTX@(x)=XPath from 190 ; @INX@(XPath)=x 191 N ZI S ZI="" 192 F S ZI=$O(@INX@(ZI)) Q:ZI="" D ;FOR EACH XPATH IN THE INPUT 193 . S @OUTX@(@INX@(ZI))=ZI ; SET INVERTED ENTRY 194 Q 195 ; 196 DEMUX(OUTX,INX) ;PARSES XPATH PASSED BY VALUE IN INX TO REMOVE [x] MULTIPLES 197 ; RETURNS OUTX: MULTIPLE^SUBMULTIPLE^XPATH 198 N ZX,ZY,ZZ,ZZ1,ZMULT,ZSUB 199 S (ZMULT,ZSUB)="" 200 S ZX=$P(INX,"[",2) 201 I ZX'="" D ; THERE IS A [x] MULTIPLE 202 . S ZY=$P(INX,"[",1) ;FIRST PART OF XPATH 203 . S ZMULT=$P(ZX,"]",1) ; NUMBER OF THE MULTIPLE 204 . S ZX=ZY_$P(ZX,"]",2) ; REST OF THE XPATH 205 . I $P(ZX,"[",2)'="" D ; A SUB MULTIPLE EXISTS 206 . . S ZZ=$P(ZX,"[",1) ; FIRST PART OF XPATH 207 . . S ZX=$P(ZX,"[",2) ; DELETE THE [ 208 . . S ZSUB=$P(ZX,"]",1) ; NUMBER OF THE SUBMULTIPLE 209 . . S ZX=ZZ_$P(ZX,"]",2) ; REST OF THE XPATH 210 E S ZX=INX ;NO MULTIPLE HERE 211 S @OUTX=ZMULT_"^"_ZSUB_"^"_ZX ;RETURN MULTIPLE^SUBMULTIPLE^XPATH 212 Q 213 ; 214 DEMUXARY(OARY,IARY,DEPTH) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO 215 ; FORMAT @OARY@(x,variablename) where x is the first multiple 216 ; IF DEPTH=2, THE LAST 2 PARTS OF THE XPATH WILL BE USED 217 N ZI,ZJ,ZK,ZL,ZM S ZI="" 218 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; 219 . D DEMUX^C0CMXP("ZJ",ZI) 220 . S ZK=$P(ZJ,"^",3) 221 . S ZM=$RE($P($RE(ZK),"/",1)) 222 . I $G(DEPTH)=2 D ;LAST TWO PARTS OF XPATH USED FOR THE VARIABLE NAME 223 . . S ZM=$RE($P($RE(ZK),"/",2))_ZM 224 . S ZL=$P(ZJ,"^",1) 225 . I ZL="" S ZL=1 226 . I $D(@OARY@(ZL,ZM)) D ;IT'S A DUP 227 . . S @OARY@(ZL,ZM_"[2]")=@IARY@(ZI) 228 . E S @OARY@(ZL,ZM)=@IARY@(ZI) 229 Q 230 ; 231 DEMUX2(OARY,IARY,DEPTH) ;CONVERT AN XPATH ARRAY PASSED AS IARY TO 232 ; FORMAT @OARY@(x,variablename) where x is the first multiple 233 ; IF DEPTH=2, THE LAST 2 PARTS OF THE XPATH WILL BE USED 234 N ZI,ZJ,ZK,ZL,ZM S ZI="" 235 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; 236 . D DEMUX^C0CMXP("ZJ",ZI) 237 . S ZK=$P(ZJ,"^",3) 238 . S ZM=$RE($P($RE(ZK),"/",1)) 239 . I $G(DEPTH)=2 D ;LAST TWO PARTS OF XPATH USED FOR THE VARIABLE NAME 240 . . S ZM=$RE($P($RE(ZK),"/",2))_"."_ZM 241 . S ZL=$P(ZJ,"^",1) 242 . I ZL="" S ZL=1 243 . I $D(@OARY@(ZL,ZM)) D ;IT'S A DUP 244 . . S @OARY@(ZL,ZM_"[2]")=@IARY@(ZI) 245 . E S @OARY@(ZL,ZM)=@IARY@(ZI) 246 Q 247 ; 248 DEMUXXP1(OARY,IARY) ;IARY IS INCOMING XPATH ARRAY 249 ; BOTH IARY AND OARY ARE PASSED BY NAME 250 ; RETURNS A SIMPLE XPATH ARRAY WITHOUT MULTIPLES. DUPLICATES ARE REMOVED 251 N ZI,ZJ,ZK 252 S ZI="" 253 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; FOR EACH XPATH IN IARY 254 . D DEMUX^C0CMXP("ZJ",ZI) 255 . S ZK=$P(ZJ,"^",3) ;THE XPATH 256 . S @OARY@(ZK)=@IARY@(ZI) ;THE RESULT. DUPLICATES WILL NOT SHOW 257 . ; CAUTION, IF THERE ARE MULTIPLES, ONLY THE DATA FOR THE LAST 258 . ; MULTIPLE WILL BE INCLUDED IN THE OUTPUT ARRAY, ASSIGNED TO THE 259 . ; COMMON XPATH 260 Q 261 ; 262 DEMUXXP2(OARY,IARY) ; IARY AND OARY ARE PASSED BY NAME 263 ; IARY IS AN XPATH ARRAY THAT MAY CONTAIN MULTIPLES 264 ; OARY IS THE OUTPUT ARRAY WHERE MULTIPLES ARE RETURNED IN THE FORM 265 ; @OARY@(x,Xpath)=data or @OARY@(x,y,Xpath)=data WHERE x AND y ARE 266 ; THE MULTIPLES AND Xpath IS THE BASE XPATH WITHOUT [x] AND [y] 267 ; 268 N ZI,ZJ,ZK,ZX,ZY,ZP 269 S ZI="" 270 F S ZI=$O(@IARY@(ZI)) Q:ZI="" D ; FOR EACH INPUT XPATH 271 . D DEMUX("ZJ",ZI) ; PULL OUT THE MULTIPLES 272 . S ZX=$P(ZJ,"^",1) ;x 273 . S ZY=$P(ZJ,"^",2) ;y 274 . S ZP=$P(ZJ,"^",3) ;Xpath 275 . I ZX="" S ZX=1 ; NO MULTIPLE WILL STORE IN x=1 276 . I ZY'="" D ;IS THERE A y? 277 . . S @OARY@(ZX,ZY,ZP)=@IARY@(ZI) 278 . E D ;NO y 279 . . S @OARY@(ZX,ZP)=@IARY@(ZI) 280 Q 281 ; 282 UPDIE ; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS 283 K ZERR 284 D CLEAN^DILF 285 D UPDATE^DIE("","C0CFDA","","ZERR") 286 I $D(ZERR) D ; 287 . W "ERROR",! 288 . ZWR ZERR 289 . B 290 K C0CFDA 291 Q 292 ;
Note:
See TracChangeset
for help on using the changeset viewer.
