XpathProcessor.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. /**
  2. * xpath 연산함수
  3. */
  4. function xPathOperation (strOperation, xnNode)
  5. {
  6. var strCalculation = strOperation;
  7. // 함수형식의 정규식 작성
  8. strCalculation = strCalculation.replaceAll(""", "\"");
  9. var strReg=/(([a-z]|\d|\)|\'|\"|\s)\=([a-z]|\d|\/|\(|\'|\"|\s))/g; // = -> == 변환
  10. var alOperator = strCalculation.match(strReg);
  11. if (null != alOperator)
  12. {
  13. for(var i = 0 ; i < alOperator.length; i++)
  14. {
  15. var strOperatorTempData = alOperator[i];
  16. strOperatorTempData = strOperatorTempData.replace(/\=/g,"==");
  17. strCalculation = strCalculation.replaceAll(alOperator[i], strOperatorTempData);
  18. }
  19. }
  20. while(true)
  21. {
  22. var rePattern = /(([a-z]+)\-([a-z]+)\-(([a-z]+)(\s+|))\(((([A-Za-z]|\d|\&\&|\|\||\%|\/|\+|\-||\=\=|\!\=|\*|\<|\<\=|\>|\>|\'|\"|\,|\.|\s)+)|)\))|(([a-z]+)\-(([a-z]+)(\s+|))\(((([A-Za-z]|\d|\&\&|\|\||\%|\/|\+|\-||\=\=|\!\=|\*|\<|\<\=|\>|\>|\'|\"|\,|\.|\s)+)|)\))|((([a-z]+)(\s+|))\(((([A-Za-z]|\d|\&\&|\|\||\%|\/|\+|\-||\=\=|\!\=|\*|\<|\<\=|\>|\>|\'|\"|\,|\.|\s)+)|)\))/g;
  23. var alFunctionResult = strCalculation.match(rePattern);
  24. if (null != alFunctionResult)
  25. {
  26. alFunctionResult.fextractDupArr(); // 배열의 값 중복제거
  27. for(var i = 0 ; i < alFunctionResult.length; i++)
  28. {// 수식에 xPath 함수가 있다면 먼저 실행하여 결과값을 추출한다
  29. try
  30. { //기존에 사용하던 Xpath 함수 형식을 구현한 함수형식으로 변환한다.
  31. var strTransValue = alFunctionResult[i].replaceAll("-", "_");
  32. if (-1 != strTransValue.indexOf("/"))
  33. {
  34. var bXpathNodeFunctionExist =false;
  35. if (strTransValue.isRegular(/(avg|min|max|sum|position|last|count|text|node|namespace\_uri|local\_name|name)(\s+|)\(/g))
  36. {
  37. bXpathNodeFunctionExist = true;
  38. }
  39. var strRefPattern = /(\.\.|(\/(\w+(\[\d\]|))))+/g;//Xpath 정규식 작성
  40. var alRefAddress = strTransValue.match(strRefPattern);
  41. if (null != alRefAddress)
  42. { // 정규식 으로 Xpath 가 존재하는 검사
  43. alRefAddress.fextractDupArr();
  44. for(var j = 0 ; j < alRefAddress.length; j++)
  45. { // 수식에 Xpath 존재한다면 결과값을 호출한다
  46. if (!bXpathNodeFunctionExist)
  47. {
  48. if (null != xnNode && alRefAddress[j].isRegular(/\.\.\//g))
  49. {
  50. var strTempData = XmlLib.getTextValue(xnNode.selectSingleNode(alRefAddress[j]));
  51. }
  52. else
  53. {
  54. var strTempData = model.getValue(alRefAddress[j]);
  55. }
  56. }
  57. else
  58. {
  59. var strTempData = alRefAddress[j];
  60. }
  61. if(!isFinite(strTempData))
  62. { // 숫자인지 문자인지 판별하여 문자일 경우 문자처리
  63. strTempData = "\"" + strTempData + "\"";
  64. }//Xpath 수식의 자리에 Xpath의 반환된 결과값으로 변환시킨다.
  65. strTransValue = strTransValue.replaceAll(alRefAddress[j], strTempData);
  66. }
  67. }
  68. }
  69. var resultValue = window.eval("xPath_"+ strTransValue.trim());
  70. strCalculation = strCalculation.replaceAll(alFunctionResult[i],String(resultValue));
  71. }
  72. catch (e)
  73. {
  74. return "";
  75. }
  76. }
  77. }
  78. else
  79. {
  80. break;
  81. }
  82. }
  83. // 식 변환
  84. if (strCalculation.isRegular(/(\s|\))(and|or|mod|div)(\s|\()/g))
  85. {
  86. var alTransMathMark = strCalculation.match(/(\s|\))(and|or|mod|div)(\s|\()/g);
  87. alTransMathMark.fextractDupArr();
  88. for(var i = 0 ; i < alTransMathMark.length; i++)
  89. {
  90. strCalculation = strCalculation.replaceAll(alTransMathMark[i], alTransMathMark[i].replace(/and/g," && ").replace(/or/g," || ").replace(/mod/g, " % ").replace(/div/g," / "));
  91. }
  92. }
  93. var bOperation = false;
  94. if (strCalculation.isRegular(/(\&\&)|(\|\|)|(\%)|(\/)|(\+)|(\-)|(\=\=)|(\!\=)|(\*)|(\<)|(\<\=)|(\>)|(\>\=)/g))
  95. {
  96. bOperation = true;
  97. }
  98. //xPath 수식의 패턴을 찾는다
  99. rePattern = /(\.\.|(\/(\w+(\[\d\]|))))+/g;
  100. var alXpathResult = strCalculation.match(rePattern);
  101. if (null != alXpathResult)
  102. {
  103. alXpathResult.fextractDupArr();
  104. for(var i = 0 ; i < alXpathResult.length; i++)
  105. {
  106. if (-1 != alXpathResult[i].indexOf("/"))
  107. {
  108. if (null != xnNode && alXpathResult[i].isRegular(/\.\.\//g))
  109. {
  110. var resultValue = XmlLib.getTextValue(xnNode.selectSingleNode(alXpathResult[i]));
  111. }
  112. else
  113. {
  114. var resultValue = model.getValue(alXpathResult[i]);
  115. }
  116. if (bOperation)
  117. {
  118. if (resultValue.isEmpty())
  119. {
  120. strCalculation = strCalculation.replaceAll(alXpathResult[i],"0");
  121. }
  122. else
  123. {
  124. strCalculation = strCalculation.replaceAll(alXpathResult[i],resultValue);
  125. }
  126. }
  127. else
  128. {
  129. strCalculation = strCalculation.replaceAll(alXpathResult[i],resultValue);
  130. }
  131. }
  132. }
  133. }
  134. var reStringNumberPattern = /(\"|\')(\d+)(\"|\')/g; //수식에서 숫자로 구성된 문자열을 찾는다
  135. var alStringNumberResult = strCalculation.match(reStringNumberPattern);
  136. if (null != alStringNumberResult)
  137. {
  138. alStringNumberResult.fextractDupArr();
  139. for(var j = 0 ; j < alStringNumberResult.length; j++)
  140. {
  141. strCalculation = strCalculation.replaceAll(alStringNumberResult[j], alStringNumberResult[j].replace(/\'|\"/g,""));
  142. }
  143. }
  144. if (bOperation)
  145. {
  146. try
  147. {
  148. var strEnddingCalculate = window.eval(strCalculation);
  149. if (strCalculation.isRegular(/\&\&|\|\|/g))
  150. {
  151. if (Number(strEnddingCalculate))
  152. {
  153. return Number(strEnddingCalculate) ? true : false;
  154. }
  155. else
  156. {
  157. return strEnddingCalculate;
  158. }
  159. }
  160. else
  161. {
  162. return strEnddingCalculate;
  163. }
  164. }
  165. catch (e)
  166. {
  167. return "";
  168. }
  169. }
  170. else
  171. {
  172. return strCalculation;
  173. }
  174. };
  175. /**
  176. * xPath 함수(Node Function)
  177. * @return
  178. */
  179. function xPath_name (strFirstData)
  180. {
  181. var alReturnValue = strFirstData.split(/\//g);
  182. return String(alReturnValue[alReturnValue.length - 1]);
  183. };
  184. function xPath_local_name (strFirstData)
  185. {
  186. var alReturnValue = strFirstData.split(/\//g);
  187. return String(alReturnValue[alReturnValue.length - 1]);
  188. };
  189. /**
  190. * xPath 함수(Context Function)
  191. * @return
  192. */
  193. function xPath_count (strFirstData)
  194. {
  195. var alRefNode = model.getInstancePart(null, strFirstData);
  196. return String(alRefNode.length);
  197. };
  198. /**
  199. * xPath 함수(Boolean Function)
  200. * @return
  201. */
  202. function xPath_boolean (strFirstData)
  203. {//Xpath 표현을 true/false
  204. strTransString = xPath_string(strFirstData);
  205. if ("0" != strTransString && "false" != strTransString)
  206. {
  207. return true;
  208. }
  209. else
  210. {
  211. return false;
  212. }
  213. };
  214. function xPath_not (bStringData)
  215. {//현재 상태의 boolean 값의 반대 값을 반환
  216. if (bStringData)
  217. {
  218. return false;
  219. }
  220. else
  221. {
  222. return true;
  223. }
  224. };
  225. function xPath_true ()
  226. {//항상 true를 반환
  227. return true;
  228. };
  229. function xPath_false ()
  230. {//항상 false를 반환
  231. return false;
  232. };
  233. /**
  234. * xPath 함수(String Function)
  235. * @return
  236. */
  237. function xPath_string (objData)
  238. { // 인수로 받은 값을 무조건 문자열로 반환
  239. if (objData)
  240. {
  241. var strStringConvert = String(objData);
  242. return strStringConvert;
  243. }
  244. return "";
  245. };
  246. function xPath_string_length (strStringData)
  247. { // 문자열의 길이를 반환
  248. if(strStringData)
  249. {
  250. strStringData = xPath_string (strStringData);
  251. return strStringData.length;
  252. }
  253. return 0;
  254. };
  255. function xPath_concat ()
  256. { // 인자로 받는 여러 개의 문자열을 하나의 문자열로 결합해서 반환
  257. var strReturnValue = "";
  258. for (var i=0 ; i < arguments.length ; i++)
  259. {
  260. strReturnValue += xPath_string (arguments[i]);
  261. }
  262. return strReturnValue;
  263. };
  264. function xPath_starts_with (strFirstData , strsecondData)
  265. {//첫번째 인자로 오는 문자열이 두 번째 인자로 오는 문자열로 시작하는지를 판단
  266. strFirstData = xPath_string (strFirstData);
  267. strsecondData = xPath_string (strsecondData);
  268. if (0 == strFirstData.indexOf(strsecondData))
  269. {
  270. return true;
  271. }
  272. else
  273. {
  274. return false;
  275. }
  276. };
  277. function xPath_contains (strFirstData , strsecondData)
  278. {// 첫 번째 인자로 오는 문자열 안에 두번째 인자로 오는 문자열이 포환되어 있는지 여부
  279. strFirstData = xPath_string (strFirstData);
  280. strsecondData = xPath_string (strsecondData);
  281. if (-1 != strFirstData.indexOf(strsecondData))
  282. {
  283. return true;
  284. }
  285. else
  286. {
  287. return false;
  288. }
  289. };
  290. function xPath_substring (strFirstData, nStartPoint, nEndPoint)
  291. {
  292. strFirstData = xPath_string (strFirstData);
  293. return strFirstData.substring(nStartPoint-1, nEndPoint);
  294. };
  295. function xPath_substring_before (strFirstData, strSecondData)
  296. {
  297. strFirstData = xPath_string (strFirstData);
  298. strsecondData = xPath_string (strsecondData);
  299. var nStrPoint = strFirstData.indexOf(strSecondData);
  300. return strFirstData.substring(0, nStrPoint);
  301. };
  302. function xPath_substring_after (strFirstData, strSecondData)
  303. {
  304. strFirstData = xPath_string (strFirstData);
  305. strsecondData = xPath_string (strsecondData);
  306. var nStrPoint = strFirstData.indexOf(strSecondData);
  307. return strFirstData.substring(nStrPoint + 1, strFirstData.length);
  308. };
  309. function xPath_normalize_space (strFirstData)
  310. {
  311. strFirstData = xPath_string (strFirstData);
  312. return strFirstData.trim();
  313. };
  314. function xPath_translate (strFirstData, strSecondData, strThirdData)
  315. {
  316. strFirstData = xPath_string (strFirstData);
  317. strsecondData = xPath_string (strsecondData);
  318. strThirdData = xPath_string (strThirdData);
  319. return strFirstData.replaceAll(strSecondData, strThirdData);
  320. };
  321. /**
  322. * xPath 함수(Numeric Function)
  323. * @return
  324. */
  325. function xPath_number (strFirstData)
  326. {
  327. strFirstData = xPath_string (strFirstData);
  328. return Number(strFirstData);
  329. };
  330. function xPath_ceiling (strFirstData)
  331. {
  332. return Math.ceil(xPath_number (strFirstData));
  333. };
  334. function xPath_floor (strFirstData)
  335. {
  336. return Math.floor(xPath_number (strFirstData));
  337. };
  338. function xPath_round (strFirstData)
  339. {
  340. return Math.round(xPath_number (strFirstData));
  341. };
  342. /**
  343. * xPath 함수(Aggregate Function)
  344. * @return
  345. */
  346. function xPath_avg (strFirstData)
  347. {
  348. var xlRefNode = model.getInstancePart(null, strFirstData);
  349. var nSumValue = 0;
  350. for (var i = 0 ; i < xlRefNode.length ; i++)
  351. {
  352. var strValue = XmlLib.getTextValue(xlRefNode.item(i));
  353. if ("" != strValue)
  354. {
  355. if (isFinite(strValue))
  356. {
  357. nSumValue += Number(strValue);
  358. }
  359. }
  360. }
  361. return String((nSumValue/alRefNode.length));
  362. };
  363. function xPath_min (strFirstData)
  364. {
  365. var xlRefNode = model.getInstancePart(null, strFirstData);
  366. var nSumValue = 0;
  367. for (var i = 0 ; i < xlRefNode.length ; i++)
  368. {
  369. var strValue = XmlLib.getTextValue(xlRefNode.item(i));
  370. if ("" != strValue)
  371. {
  372. if (isFinite(strValue))
  373. {
  374. nSumValue = nSumValue <= Number(strValue)? nSumValue : Number(strValue);
  375. }
  376. }
  377. }
  378. return String(nSumValue);
  379. };
  380. function xPath_max (strFirstData)
  381. {
  382. var xlRefNode = model.getInstancePart(null, strFirstData);
  383. var nSumValue = 0;
  384. for (var i = 0 ; i < xlRefNode.length ; i++)
  385. {
  386. var strValue = XmlLib.getTextValue(xlRefNode.item(i));
  387. if ("" != strValue)
  388. {
  389. if (isFinite(strValue))
  390. {
  391. nSumValue = nSumValue >= Number(strValue)? nSumValue : Number(strValue);
  392. }
  393. }
  394. }
  395. return String(nSumValue);
  396. };
  397. function xPath_sum (strFirstData)
  398. {
  399. var xlRefNode = model.getInstancePart(null, strFirstData);
  400. var nSumValue = 0;
  401. for (var i = 0 ; i < xlRefNode.length ; i++)
  402. {
  403. var strValue = XmlLib.getTextValue(xlRefNode.item(i));
  404. if ("" != strValue)
  405. {
  406. if (isFinite(strValue))
  407. {
  408. nSumValue += Number(strValue);
  409. }
  410. }
  411. }
  412. return String(nSumValue);
  413. };
  414. /**
  415. * xPath 함수(Date Function)
  416. * @return
  417. */
  418. function xPath_days_from_date (strFirstData)
  419. {
  420. if (strFirstData.isRegular(/[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]/g))
  421. {
  422. strFirstData = strFirstData.replace(/\-/g,"/");
  423. return String(Math.round(Math.abs(Date.parse(strFirstData)/1000/60/60/24)));
  424. }
  425. else
  426. {
  427. return "";
  428. }
  429. };
  430. function xPath_seconds_from_datetime (strFirstData)
  431. {
  432. if (strFirstData.isRegular(/[0-9][0-9][0-9][0-9]\-[0-9][0-9]\-[0-9][0-9]/g))
  433. {
  434. strFirstData = strFirstData.replace(/\-/g,"/");
  435. return String(Math.round(Math.abs(Date.parse(strFirstData)/1000)));
  436. }
  437. else
  438. {
  439. return "";
  440. }
  441. };
  442. function xPath_seconds (strFirstData)
  443. {
  444. };
  445. function xPath_months (strFirstData)
  446. {
  447. };
  448. /**
  449. * xPath 함수(XForms Function)
  450. * @return
  451. */
  452. function xPath_luhn (strFirstData)
  453. {
  454. strFirstData = xPath_string (strFirstData);
  455. if (12 <= strFirstData.length && 19 >= strFirstData.length)
  456. {
  457. for (var i = 0 ; i < strFirstData.length ; i++)
  458. {
  459. if (isNaN(strFirstData.substring(i,i + 1)))
  460. {
  461. return false;
  462. }
  463. }
  464. return true;
  465. }
  466. else
  467. {
  468. return false;
  469. }
  470. };
  471. function xPath_if (bBoolean, strFirstData, strSecondData)
  472. {
  473. if (bBoolean)
  474. {
  475. return xPath_string(strFirstData);
  476. }
  477. else
  478. {
  479. return xPath_string(strSecondData);
  480. }
  481. };
  482. function xPath_boolean_from_string (strFirstData)
  483. {
  484. strTransString = xPath_string(strFirstData);
  485. if ("0" == strTransString || "false" == strTransString)
  486. {
  487. return false;
  488. }
  489. else if ("1" == strTransString || "true" == strTransString)
  490. {
  491. return true;
  492. }
  493. return "";
  494. };
  495. function xPath_power (nBase, nExponent)
  496. {
  497. strBase = xPath_string (nBase);
  498. strExponent = xPath_string (nExponent);
  499. return Math.pow(Number(strBase), Number(strExponent));
  500. };
  501. function xPath_now ()
  502. {
  503. var now = new Date();
  504. var year = now.getUTCFullYear(); // 년도 가져오기
  505. var month = now.getMonth(); // 월 가져오기
  506. month = 9 > (month) ? "0"+(month+1):(month+1);
  507. var date = now.getDate(); // 날짜 가져오기
  508. date = 10 > (date) ? "0"+(date):(date);
  509. var hour = now.getHours(); // 시간 가져오기
  510. hour = 10 > (hour) ? "0"+(hour):(hour);
  511. var min = now.getMinutes(); // 분 가져오기
  512. min = 10 > (min) ? "0"+(min):(min);
  513. var sec = now.getSeconds(); // 초 가져오기
  514. sec = 10 > (sec) ? "0"+(sec):(sec);
  515. return year + "-" + month + "-" + date + "T" + hour + ":" + min + ":" + sec + "Z";
  516. };