2502회 채점결과 / xpath내부 "(큰따옴표)필터링 / gmdp 확장자 처리

This commit is contained in:
2025-02-27 18:11:34 +09:00
parent ce11e9f508
commit c2f5955342
23 changed files with 55 additions and 48 deletions

Binary file not shown.

BIN
250227_DIC_2502B_TEST.xlsx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -333,8 +333,8 @@
"point": 2 "point": 2
}, },
"25": { "25": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-13290016']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-14688179']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-13290016']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-14688179']",
"search": "멋진 기차 모형 (Fine Train Model)", "search": "멋진 기차 모형 (Fine Train Model)",
"point": 2 "point": 2
}, },

View File

@@ -184,30 +184,30 @@
"point": 3 "point": 3
}, },
"5": { "5": {
"ele": "//CRCUnitArr[@Name='{search}']", "ele": "//CRCUnitArr[@Name=\"{search}\"]",
"search": "자연이 빚어낸 섬", "search": "자연이 빚어낸 섬",
"point": 3 "point": 3
}, },
"6": { "6": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID102='바탕체']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit[@VID102='바탕체']",
"ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='바탕체']", "ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='바탕체']",
"search": "자연이 빚어낸 섬", "search": "자연이 빚어낸 섬",
"point": 2 "point": 2
}, },
"7": { "7": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID101='120']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit[@VID101='120']",
"ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='120']", "ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='120']",
"search": "자연이 빚어낸 섬", "search": "자연이 빚어낸 섬",
"point": 2 "point": 2
}, },
"8": { "8": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-10541088']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='4'][@VID100='-10541088']",
"ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-10541088']", "ele2": "//CROwneUnit[1]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-10541088']",
"search": "자연이 빚어낸 섬", "search": "자연이 빚어낸 섬",
"point": 2 "point": 2
}, },
"9": { "9": {
"ele": "//CRCUnitArr[@Name='{search}']/@VID600 | //CRCUnitArr[@Name='{search}']/@VID601", "ele": "//CRCUnitArr[@Name=\"{search}\"]/@VID600 | //CRCUnitArr[@Name=\"{search}\"]/@VID601",
"ele2": "//CROwneUnit[1]/CRCUnitArr/@VID600 | //CROwneUnit[1]/CRCUnitArr/@VID601", "ele2": "//CROwneUnit[1]/CRCUnitArr/@VID600 | //CROwneUnit[1]/CRCUnitArr/@VID601",
"type": "range", "type": "range",
"search": "자연이 빚어낸 섬", "search": "자연이 빚어낸 섬",
@@ -216,7 +216,7 @@
"point": 2 "point": 2
}, },
"10": { "10": {
"existEle": "//CRCUnitArr[@Name='{search}']", "existEle": "//CRCUnitArr[@Name=\"{search}\"]",
"ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/preceding-sibling::CROwneUnit))]/@Length)", "ele": "sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex=count(//CROwneUnit[1]/preceding-sibling::CROwneUnit))]/@Length)",
"type": "searchIndex", "type": "searchIndex",
"value": 150, "value": 150,
@@ -314,50 +314,50 @@
"point": 2 "point": 2
}, },
"22": { "22": {
"ele": "//CRCUnitArr[@Name='{search}']", "ele": "//CRCUnitArr[@Name=\"{search}\"]",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 3 "point": 3
}, },
"23": { "23": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"24": { "24": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID101='150']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool[@Type='1']/GCUnit[@VID101='150']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='150']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='150']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"25": { "25": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"26": { "26": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']", "ele": "//CRCUnitArr[@Name=\"{search}\"]//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"27": { "27": {
"ele": "//CRCUnitArr[@Name='{search}'][@VID505='1'][@VID507='2']", "ele": "//CRCUnitArr[@Name=\"{search}\"][@VID505='1'][@VID507='2']",
"ele2": "//CROwneUnit[2]/CRCUnitArr[@VID505='1'][@VID507='2']", "ele2": "//CROwneUnit[2]/CRCUnitArr[@VID505='1'][@VID507='2']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 3 "point": 3
}, },
"28": { "28": {
"ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit)][@Pos='0']", "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name=\"{search}\"]]/preceding::CROwneUnit)][@Pos='0']",
"ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Pos='0']", "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Pos='0']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"29": { "29": {
"ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[(@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit))][@Length='120']", "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[(@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name=\"{search}\"]]/preceding::CROwneUnit))][@Length='120']",
"ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Length='120']", "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Length='120']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"30": { "30": {

View File

@@ -109,7 +109,7 @@
"16": { "16": {
"ele": "$.children[?(@.name=='철원 금학산 등산')].text.font.colors[0]", "ele": "$.children[?(@.name=='철원 금학산 등산')].text.font.colors[0]",
"type": "color", "type": "color",
"value": "f14aeba", "value": "f1eb4a",
"point": 10 "point": 10
}, },
"17": { "17": {

View File

@@ -147,8 +147,6 @@ xpath 테스트 용
//CRTrackList[@Name='오디오1'][@Count>='1']/CRTrackClip[1][not(@ClipIndex='-1')] //CRTrackList[@Name='오디오1'][@Count>='1']/CRTrackClip[1][not(@ClipIndex='-1')]
``` ```
250221 250221
모션이미지클립 처리 JSON A형만 작성완료 모션이미지클립 처리 JSON A형만 작성완료

View File

@@ -5,7 +5,7 @@ import unicodedata
def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, target_root_d, target_root_e): def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, target_root_d, target_root_e):
for root, dirs, files in os.walk(source_root): for root, dirs, files in os.walk(source_root):
for dir_name in dirs: for dir_name in dirs:
if dir_name == 'DIW': # DIC 디렉토리 탐색 if dir_name == 'DIC': # DIC 디렉토리 탐색
parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name))) parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name)))
target_root = None target_root = None
parent_dir = unicodedata.normalize('NFC', parent_dir) parent_dir = unicodedata.normalize('NFC', parent_dir)
@@ -34,7 +34,7 @@ def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, t
print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.") print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.")
# 사용법 # 사용법
source_directory = r"C:\Users\dra\project\data\제2521회 특별검정\제2521회 디지털정보활용능력 특별검정 답안파일" # 원본 디렉토리 경로 source_directory = r"C:\Users\dra\project\data\제2502회 정기\답안파일" # 원본 디렉토리 경로
target_directory_a = r".\output\A" # '2교시'의 타겟 경로 target_directory_a = r".\output\A" # '2교시'의 타겟 경로
target_directory_b = r".\output\B" # '2교시'의 타겟 경로 target_directory_b = r".\output\B" # '2교시'의 타겟 경로
target_directory_c = r".\output\C" # '3교시'의 타겟 경로 target_directory_c = r".\output\C" # '3교시'의 타겟 경로

View File

@@ -12,9 +12,9 @@ const todayDate = getToday();
// -------------------------------------------------------- // --------------------------------------------------------
// const scoringJson = require('./DIC_2502A.json'); // const scoringJson = require('./DIC_2502A.json');
// const scoringJson = require('./DIC_2502B.json'); const scoringJson = require('./DIC_2502B.json');
// const scoringJson = require('./DIC_2502C.json'); // const scoringJson = require('./DIC_2502C.json');
const scoringJson = require('./DIC_2502D.json'); // const scoringJson = require('./DIC_2502D.json');
// TEST // TEST
// const scoringJson = require('./DIC_2502A_TEST.json'); // const scoringJson = require('./DIC_2502A_TEST.json');
@@ -23,9 +23,9 @@ const scoringJson = require('./DIC_2502D.json');
// const scoringJson = require('./DIC_2502D_TEST.json'); // const scoringJson = require('./DIC_2502D_TEST.json');
// -------------------------------------------------------- // --------------------------------------------------------
// const answerFilesDir = './output/A/DIC'; // const answerFilesDir = './output/A/DIC';
// const answerFilesDir = './output/B/DIC'; const answerFilesDir = './output/B/DIC';
// const answerFilesDir = './output/C/DIC'; // const answerFilesDir = './output/C/DIC';
const answerFilesDir = './output/D/DIC'; // const answerFilesDir = './output/D/DIC';
// TEST // TEST
// const answerFilesDir = './output/A/TEST'; // const answerFilesDir = './output/A/TEST';
@@ -35,7 +35,7 @@ const answerFilesDir = './output/D/DIC';
// -------------------------------------------------------- // --------------------------------------------------------
// const outputExcelFile = './'+todayDate+'_DIC_2502A_result.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502A_result.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502B_result.xlsx'; const outputExcelFile = './'+todayDate+'_DIC_2502B_result.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502C_result.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502C_result.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502D_result.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502D_result.xlsx';
@@ -43,7 +43,7 @@ const answerFilesDir = './output/D/DIC';
// const outputExcelFile = './'+todayDate+'_DIC_2502A_TEST.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502A_TEST.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502B_TEST.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502B_TEST.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502C_TEST.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502C_TEST.xlsx';
const outputExcelFile = './'+todayDate+'_DIC_2502D_TEST.xlsx'; // const outputExcelFile = './'+todayDate+'_DIC_2502D_TEST.xlsx';
// -------------------------------------------------------- // --------------------------------------------------------
// 답안 폴더 내부에 디렉토리가 아닌 일반 파일이 있을 경우 디렉토리만 필터링 해서 불러옴 // 답안 폴더 내부에 디렉토리가 아닌 일반 파일이 있을 경우 디렉토리만 필터링 해서 불러옴
@@ -62,7 +62,12 @@ studentDirs.forEach(student => {
const name = student.normalize('NFC'); const name = student.normalize('NFC');
const studentDir = path.join(answerFilesDir, student); const studentDir = path.join(answerFilesDir, student);
const psdFiles = fs.readdirSync(studentDir).filter(file => file.endsWith('.psd')); const psdFiles = fs.readdirSync(studentDir).filter(file => file.endsWith('.psd'));
const gmepFile = fs.readdirSync(studentDir).filter(file => file.endsWith('.gmep')); // DIAT시험 프로젝트로 생성시 gmep확장자로
// 교육용 프로젝프로 생성시 gmdp확장자로 생성됨
// 두 경우 모두 처리
const gmepFile = fs.readdirSync(studentDir).filter(
file => file.endsWith('.gmep') || file.endsWith('.gmdp')
);
// 학생 이름을 key로 하는 객체 생성 // 학생 이름을 key로 하는 객체 생성
// 채점결과 // 채점결과
@@ -160,6 +165,10 @@ function getGmepScore(gmepData, scoringJson, index) {
*/ */
if (search !== undefined) { if (search !== undefined) {
let result = findSimilarString(gmepXmlDoc, search, 0.8) let result = findSimilarString(gmepXmlDoc, search, 0.8)
// xpath 내부 "(큰따옴표) 필터링
if (result !== null) {
result = result.replace(/"/g, "'");
}
ele = ele.replace(/{search}/g, result); ele = ele.replace(/{search}/g, result);
if ( existEle !== undefined ){ if ( existEle !== undefined ){
existEle = existEle.replace(/{search}/g, result); existEle = existEle.replace(/{search}/g, result);

View File

@@ -333,8 +333,8 @@
"point": 2 "point": 2
}, },
"25": { "25": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-13290016']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-14688179']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-13290016']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-14688179']",
"search": "멋진 기차 모형 (Fine Train Model)", "search": "멋진 기차 모형 (Fine Train Model)",
"point": 2 "point": 2
}, },

View File

@@ -315,49 +315,49 @@
}, },
"22": { "22": {
"ele": "//CRCUnitArr[@Name='{search}']", "ele": "//CRCUnitArr[@Name='{search}']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 3 "point": 3
}, },
"23": { "23": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID102='돋움체']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"24": { "24": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID101='150']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool[@Type='1']/GCUnit[@VID101='150']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='150']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool[@Type='1']/GCUnit[@VID101='150']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"25": { "25": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='4'][@VID100='-1487764']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"26": { "26": {
"ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']", "ele": "//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']",
"ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']", "ele2": "//CROwneUnit[2]/CRCUnitArr//GCUnitPool/GCUnit[@Type='2'][@VID100='0.30000001'][@VID101='-1']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"27": { "27": {
"ele": "//CRCUnitArr[@Name='{search}'][@VID505='1'][@VID507='2']", "ele": "//CRCUnitArr[@Name='{search}'][@VID505='1'][@VID507='2']",
"ele2": "//CROwneUnit[2]/CRCUnitArr[@VID505='1'][@VID507='2']", "ele2": "//CROwneUnit[2]/CRCUnitArr[@VID505='1'][@VID507='2']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 3 "point": 3
}, },
"28": { "28": {
"ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit)][@Pos='0']", "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit)][@Pos='0']",
"ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Pos='0']", "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Pos='0']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"29": { "29": {
"ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[(@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit))][@Length='120']", "ele": "//CRTrackList[@Name='텍스트']/CRTrackClip[(@ClipIndex=count(//CROwneUnit[.//CRCUnitArr[@Name='{search}']]/preceding::CROwneUnit))][@Length='120']",
"ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Length='120']", "ele2": "//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[2]/CRCUnitArr/preceding::CROwneUnit)][@Length='120']",
"search": "마나가하섬으로 가자 (Lets go to Managaha Island)", "search": "마나가하섬으로 가자 (Let's go to Managaha Island)",
"point": 2 "point": 2
}, },
"30": { "30": {