Compare commits

..

9 Commits

136 changed files with 13427 additions and 3014 deletions

View File

@@ -1,56 +1,49 @@
import os
import shutil
from pathlib import Path
import re
import glob
# 채점자료 정답 파일만 복사하는 스크립트
# ===== 사용자 설정 =====
source_dir = r"D:\project\HWP\HWP-Scoring\회차별채점자료\2601"
exam_round = "2601" # 회차명
# ── 설정 ────────────────────────────────────────────────────────────────
exam_round = "2604" # 회차명
exam_code = "DIW" # 코드명
# =======================
source_dir = rf"D:\project\HWP\HWP-Scoring\회차별채점자료\{exam_round}"
output_base = r"input"
def get_exam_type(filename: str):
"""
파일명에서 확장자 앞의 마지막 알파벳을 추출 (예: 국어A.hwpx → A)
"""
match = re.search(r"([A-Za-z])\.hwpx$", filename)
return match.group(1).upper() if match else None
types = ["A", "B", "C", "D", "E"]
# ── 복사 실행 ────────────────────────────────────────────────────────────
for type in types:
pattern = os.path.join(source_dir, f"*{type}*")
matched = [d for d in glob.glob(pattern) if os.path.isdir(d)]
def copy_exam_files():
src = Path(source_dir)
if not src.exists():
print(f"경로를 찾을 수 없습니다: {src}")
return
if not matched:
print(f"[WARN] 폴더 없음: {pattern}")
continue
base_dest = Path(".") / "input" / exam_round
copied = 0
src_folder = matched[0]
for path in src.rglob("*"):
if path.is_file() and path.suffix.lower() == ".hwpx":
exam_type = get_exam_type(path.name)
if not exam_type:
continue # 마지막 문자가 알파벳이 아니면 건너뜀
file_pattern = os.path.join(src_folder, f"제*회 디지털정보활용능력 워드프로세서(한글2022버전) {type}형 정답.hwpx")
matched_files = glob.glob(file_pattern)
dest_dir = base_dest / exam_type / exam_code
dest_dir.mkdir(parents=True, exist_ok=True)
dest_path = dest_dir / path.name
if not matched_files:
print(f"[WARN] 파일 없음: {file_pattern}")
continue
# 같은 이름의 파일이 있을 경우 숫자 붙이기
counter = 1
while dest_path.exists():
dest_path = dest_dir / f"{path.stem}_{counter}{path.suffix}"
counter += 1
src_path = matched_files[0]
shutil.copy2(path, dest_path)
print(f"복사 완료: {path}{dest_path}")
copied += 1
# 원본 확장자 추출 후 새 파일명 생성: DIW_2602A.hwpx
src_ext = os.path.splitext(src_path)[1]
new_filename = f"{exam_code}_{exam_round}{type}{src_ext}"
print(f"\n{copied}개 파일 복사 완료.")
dst_folder = os.path.join(output_base, exam_round, type, exam_code)
os.makedirs(dst_folder, exist_ok=True)
dst_path = os.path.join(dst_folder, new_filename)
shutil.copy2(src_path, dst_path)
print(f"[OK] {type}형 복사 완료 → {dst_path}")
if __name__ == "__main__":
copy_exam_files()
# ── TEST 폴더 생성 ────────────────────────────────────────────────────────
test_folder = os.path.join(output_base, exam_round, type, "TEST")
os.makedirs(test_folder, exist_ok=True)
print("\n전체 처리 완료.")

View File

@@ -1,4 +1,6 @@
# 분류되지 않은 답안파일 원본 폴더에서 복사할 때 사용
# DIW 폴더가 있는 경우, 부모 디렉토리 이름에 따라 A, B, C, D, E 폴더로 복사
# 예시: D:\project\data\제2601회 정기\제2601회 정기\과목별답안파일\1교시\DIW → .\input\2601\A\DIW
import os
import shutil
@@ -41,10 +43,10 @@ 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교시'.")
# 사용법
exam_round = "2601_2"
exam_round = "2604_5"
# exam_round = "2510_4"
# source_directory = r"D:\project\data\제2510회 수시2(제주)\답안파일\제2510회 수시2 제주지부_답안파일"
source_directory = r"D:\project\data\제2601회 수시2(제주)\제2601회 수시2(제주)\답안파일\2601회 수시2 답안파일"
source_directory = r"D:\project\data\제2604회 수시5(읍내)\답안파일\2604회 수시5_읍내정보통신학교"
target_directory_a = f".\\input\\{exam_round}\\A" # '1교시'의 타겟 경로

View File

@@ -1,4 +1,6 @@
# 분류된 "과목별" 폴더에서 시험 파일을 복사하는 스크립트
# - 시험 회차와 과목별 폴더 구조에 맞게 파일을 복사하여 "input/회차/유형/과목" 경로로 정리
# - 예시: "D:\project\data\제2622회 특별\과목별답안파일 (2)\DIW\A형" 폴더 안의 파일들을 "input/2622/A/DIW"로 복사
import os
import shutil
@@ -45,10 +47,10 @@ def copy_exam_files(exam_round, exam_codes, source_dir):
os.makedirs(target_path, exist_ok=True)
# ✅ TEST 폴더 생성: input/회차/유형/TEST
# test_folder = os.path.join("output", exam_round, exam_type, "TEST")
# if test_folder not in created_test_folders:
# os.makedirs(test_folder, exist_ok=True)
# created_test_folders.add(test_folder)
test_folder = os.path.join("output", exam_round, exam_type, "TEST")
if test_folder not in created_test_folders:
os.makedirs(test_folder, exist_ok=True)
created_test_folders.add(test_folder)
print(f"\n🔄 복사 시작: {exam_code} - 유형: {exam_type} (폴더명: {real_folder})")
print(f"📂 원본 경로: {source_folder}")
@@ -76,8 +78,8 @@ def copy_exam_files(exam_round, exam_codes, source_dir):
# 사용 예시
if __name__ == "__main__":
# [source_dir경로\DIW] 디렉토리 안에 A형, B형... 폴더가 존재해야 함
exam_round = "2512"
exam_round = "2604"
exam_codes = ["DIW"]
source_dir = r"D:\project\data\제2512회 정기_DIAT\답안파일"
source_dir = r"D:\project\data\제2604회 정기\제2604회 정기\답안파일"
copy_exam_files(exam_round, exam_codes, source_dir)

View File

@@ -166,7 +166,7 @@ if __name__ == "__main__":
setup_logging()
exam_rounds = [
"2601",
"2604",
]
# 변환할 폴더 경로 설정
@@ -178,10 +178,9 @@ if __name__ == "__main__":
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"),
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"),
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"),
]
# folders = [
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\TEST",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\TEST")]
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\TEST",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\TEST"),
]
# 변환 실행
for input, output in folders:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

850
JSON/2602/DIW_2602A.json Normal file
View File

@@ -0,0 +1,850 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "대한민국요리경연대회",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대한민국요리경연대회)/① 글씨체 (맑은 고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "대한민국요리경연대회",
"value": "53,135,146",
"points": 2,
"category": "Color",
"item": "문구 (대한민국요리경연대회)/② 채우기 : 색상(RGB:53,135,146)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "대한민국요리경연대회",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (대한민국요리경연대회)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "대한민국요리경연대회",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (대한민국요리경연대회)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "대한민국요리경연대회",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (대한민국요리경연대회)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "대한민국요리경연대회",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (대한민국요리경연대회)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "대한민국요리경연대회",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (대한민국요리경연대회)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "국",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "국",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (돋움체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "국",
"value": "255,182,137",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:255,182,137)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "국",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "대한민국 요리 경연대회",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "대한민국 요리 경연대회",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "★",
"char2": "★",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ★, ② ★, ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (★ 행사안내 ★)/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (★ 행사안내 ★)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "대한민국 요리사 협의회 홈페이지(http://www.ihd.or.kr) 참조",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (대한민국 요리사 협의회 홈페이지(http://www.ihd.or.kr) 참조)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "대한민국 요리사 협의회 홈페이지(http://www.ihd.or.kr) 참조",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (대한민국 요리사 협의회 홈페이지(http://www.ihd.or.kr) 참조)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 2. 28.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 2. 28.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 2. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 2. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "대한민국요리사협의회",
"value": "맑은 고딕",
"points": 1,
"category": "FontName",
"item": "문구 (대한민국요리사협의회)/① 글씨체 (맑은 고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "대한민국요리사협의회",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대한민국요리사협의회)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "대한민국요리사협의회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대한민국요리사협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "DecagonCircle",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//CHAR[contains(text(),'{searchValue}')]",
"searchValue": "http",
"value": true,
"points": 2,
"category": "hyperlink",
"item": "문구 (http://www.ihd.or.kr)/하이퍼링크 없이 작성",
"desc": "searchValue에 해당하는 주소 문구에 하이퍼링크가 하나라도 설정되어 있으면 오답"
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "180",
"first_word": "국",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "70",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (요리 산업 현황)/① 크기-너비 (70 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (요리 산업 현황)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (요리 산업 현황)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (요리 산업 현황)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "227,220,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (요리 산업 현황)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (요리 산업 현황)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (요리 산업 현황)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "돋움체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (요리 산업 현황)/⑧ 글씨체 (돋움체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (요리 산업 현황)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (요리 산업 현황)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 요리 산업의 트렌드",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구① (1. 요리 산업의 트렌드)/① 글씨체 (굴림)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 요리 산업의 트렌드",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 요리 산업의 트렌드)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 요리 산업의 트렌드",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 요리 산업의 트렌드)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 요리 경연대회의 가치",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구② (2. 요리 경연대회의 가치)/① 글씨체 (굴림)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 요리 경연대회의 가치",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 요리 경연대회의 가치)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 요리 경연대회의 가치",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 요리 경연대회의 가치)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "대체육",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (대체육)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "식물성 고기라고 불리며, 비동물성 재료로 모양과 식감을 고기와 유사하게 만든 식재료를 의미함",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (대체육)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "식물성 고기라고 불리며, 비동물성 재료로 모양과 식감을 고기와 유사하게 만든 식재료를 의미함",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대체육)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "식물성 고기라고 불리며, 비동물성 재료로 모양과 식감을 고기와 유사하게 만든 식재료를 의미함",
"value": "CircledHangulJamo",
"points": 2,
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Recipe",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Recipe/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["요리", "料理"],
["지속", "持續"],
["활용", "活用"],
["실력", "實力"],
["미식", "美食"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 요리(料理), ② 지속(持續), ③ 활용(活用), ④ 실력(實力), ⑤ 미식(美食)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'태의미식')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…새로운 미식을 형태의 창조하는…)>'미식을' / '형태의' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'광도경제')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…미식(美食) 관광은 경제적…)>'은' → '도' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/① 글씨체 (궁서)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "160,214,107",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:160,214,107)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "표식만 있는 분산형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (표식만 있는 분산형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/① 글씨체 (돋움)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "요리 산업 트렌드(단위: 건수)",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (요리 산업 트렌드(단위: 건수))/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (궁서)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (궁서)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (궁서)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -46,65 +46,65 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "거창에살으리랏다",
"value": "고딕",
"searchValue": "전문사무연합협의회출범안내",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (거창에살으리랏다)/① 글씨체 (고딕)"
"item": "문구 (전문사무연합협의회출범안내)/① 글씨체 (맑은 고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "거창에살으리랏다",
"value": "211,125,209",
"searchValue": "전문사무연합협의회출범안내",
"value": "194,58,253",
"points": 2,
"category": "Color",
"item": "문구 (거창에살으리랏다)/② 채우기 : 색상(RGB:211,125,209)"
"item": "문구 (전문사무연합협의회출범안내)/② 채우기 : 색상(RGB:194,58,253)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "거창에살으리랏다",
"value": "110",
"searchValue": "전문사무연합협의회출범안내",
"value": "140",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (거창에살으리랏다)/③ 크기-너비 (110 mm)"
"item": "문구 (전문사무연합협의회출범안내)/③ 크기-너비 (140 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "거창에살으리랏다",
"searchValue": "전문사무연합협의회출범안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (거창에살으리랏다)/④ 크기-높이 (20 mm)"
"item": "문구 (전문사무연합협의회출범안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "거창에살으리랏다",
"searchValue": "전문사무연합협의회출범안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (거창에살으리랏다)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (전문사무연합협의회출범안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "거창에살으리랏다",
"searchValue": "전문사무연합협의회출범안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (거창에살으리랏다)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (전문사무연합협의회출범안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "거창에살으리랏다",
"searchValue": "전문사무연합협의회출범안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (거창에살으리랏다)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (전문사무연합협의회출범안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,7 +116,7 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"searchValue": "",
"value": "궁서체",
"points": 1,
"category": "FontName",
@@ -124,15 +124,15 @@
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "174,227,120",
"searchValue": "",
"value": "87,172,220",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:174,227,120)"
"item": "어/③ 면색 : 색상(RGB:87,172,220)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,31 +141,31 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "저출산/고령화 수치(중위연령, 고령화지수, 출산율)",
"value": "ITALIC",
"searchValue": "비전과 목표를 공유",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (저출산/고령화 수치(중위연령, 고령화지수, 출산율))/① ITALIC"
"item": "문구 (비전과 목표를 공유)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "저출산/고령화 수치(중위연령, 고령화지수, 출산율)",
"searchValue": "비전과 목표를 공유",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (저출산/고령화 수치(중위연령, 고령화지수, 출산율))/② UNDERLINE"
"item": "문구 (비전과 목표를 공유)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "",
"char2": "",
"char1": "",
"char2": "",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① , ② , ③ ※"
"item": "① , ② , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
@@ -173,7 +173,7 @@
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 ( 행사안내 )/① 글씨체 (궁서)"
"item": "문구 ( 행사안내 )/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
@@ -181,25 +181,25 @@
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026. 01. 25.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"searchValue": "본회 홈페이지(http://www.ihd.or.kr)에서 신청 가능",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026. 01. 25.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/① BOLD"
"item": "문구 (본회 홈페이지(http://www.ihd.or.kr)에서 신청 가능)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026. 01. 25.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": "UNDERLINE",
"searchValue": "본회 홈페이지(http://www.ihd.or.kr)에서 신청 가능",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026. 01. 25.(일) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/② UNDERLINE"
"item": "문구 (본회 홈페이지(http://www.ihd.or.kr)에서 신청 가능)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
@@ -215,52 +215,52 @@
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 01. 24.",
"searchValue": "2026. 2. 28.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 01. 24.)/① 크기 (1300)",
"item": "문구 (2026. 2. 28.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 01. 24.",
"searchValue": "2026. 2. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 01. 24.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 2. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "거창군청",
"value": "휴먼옛체",
"searchValue": "한국전문사무연합협의회",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구 (거창군청)/① 글씨체 (휴먼옛체)"
"item": "문구 (한국전문사무연합협의회)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "거창군청",
"value": "2700",
"searchValue": "한국전문사무연합협의회",
"value": "2400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (거창군청)/② 크기 (2700)"
"item": "문구 (한국전문사무연합협의회)/② 크기 (2400)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "거창군청",
"searchValue": "한국전문사무연합협의회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (거창군청)/③ 정렬 (가운데 정렬)"
"item": "문구 (한국전문사무연합협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "돋움",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -280,10 +280,10 @@
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "LatinCapital",
"value": "RomanCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"item": "① 쪽 번호 매기기 (I,II,III 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -330,11 +330,11 @@
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "180",
"first_word": "",
"value": "190",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 180% 설정",
"item": "문제 1 줄간격 190% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "65",
"value": "45",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (인구절벽)/① 크기-너비 (65 mm)"
"item": "문구 (전문사무)/① 크기-너비 (45 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (인구절벽)/② 크기-높이 (12 mm)"
"item": "문구 (전문사무)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,51 +387,51 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (인구절벽)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (전문사무)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (인구절벽)/④ 글상자 모서리 (둥근모양)",
"item": "문구 (전문사무)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "244,220,42",
"value": "249,176,199",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (인구절벽)/⑤ 채우기 : 색상(RGB:244,220,42)"
"item": "문구 (전문사무)/⑤ 채우기 : 색상(RGB:249,176,199)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (인구절벽)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (전문사무)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (인구절벽)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (전문사무)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "휴먼옛체",
"value": "견고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (인구절벽)/⑧ 글씨체 (휴먼옛체)"
"item": "문구 (전문사무)/⑧ 글씨체 (견고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (인구절벽)/⑨ 글씨크기 (2000)",
"item": "문구 (전문사무)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,14 +439,14 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (인구절벽)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (전문사무)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림C.jpg\" 삽입",
"item": "① 파일명 \"그림B.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
@@ -479,81 +479,81 @@
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 인구절벽이란?",
"value": "중고딕",
"searchValue": "1. 전문사무",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 인구절벽이란?)/① 글씨체 (중고딕)"
"item": "문구① (1. 전문사무)/① 글씨체 (굴림체)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 인구절벽이란?",
"searchValue": "1. 전문사무",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 인구절벽이란?)/② 크기 (1200)"
"item": "문구① (1. 전문사무)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 인구절벽이란?",
"searchValue": "1. 전문사무",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 인구절벽이란?)/③ 진하게"
"item": "문구① (1. 전문사무)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 인구절벽 대응책",
"value": "중고딕",
"searchValue": "2. 전문사무의 동향",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 인구절벽 대응책)/① 글씨체 (중고딕)"
"item": "문구② (2. 전문사무의 동향)/① 글씨체 (굴림체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 인구절벽 대응책",
"searchValue": "2. 전문사무의 동향",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 인구절벽 대응책)/② 크기 (1200)"
"item": "문구② (2. 전문사무의 동향)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 인구절벽 대응책",
"searchValue": "2. 전문사무의 동향",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 인구절벽 대응책)/③ 진하게"
"item": "문구② (2. 전문사무의 동향)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "생산가능인구",
"option": "인공지능 리터러시",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (생산가능인구)/① 각주 설정 및 문구 입력"
"item": "문구 (인공지능 리터러시)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "전체 인구가 늘더라도 생산가능인구가 감소한다면 생산가능인구가 짊어져야 하는 비용은 증가한다.",
"value": "굴림",
"searchValue": "인공지능을 이해하고 활용할 수 있는 능력",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (생산가능인구)/② 글씨체 (굴림)"
"item": "문구 (인공지능 리터러시)/② 글씨체 (중고딕)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "전체 인구가 늘더라도 생산가능인구가 감소한다면 생산가능인구가 짊어져야 하는 비용은 증가한다.",
"searchValue": "인공지능을 이해하고 활용할 수 있는 능력",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (생산가능인구)/③ 크기 (9pt)"
"item": "문구 (인공지능 리터러시)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "전체 인구가 늘더라도 생산가능인구가 감소한다면 생산가능인구가 짊어져야 하는 비용은 증가한다.",
"value": "DecagonCircleHanja",
"searchValue": "인공지능을 이해하고 활용할 수 있는 능력",
"value": "CircledHangulJamo",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
@@ -580,80 +580,80 @@
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Disaster",
"ignoreWord": "Chatgpt",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Disaster/영단어 미입력, 대소문자/오타 시 전체 감점",
"item": "Chatgpt/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["이론", "理論"],
["분포", "分布"],
["확산", "擴散"],
["변화", "變化"],
["확대", "擴大"]
["기술", "技術"],
["도약", "跳躍"],
["동향", "動向"],
["역량", "力量"],
["혁신", "革新"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 이론(理論), ② 분포(分布), ③ 확산(擴散), ④ 변화(變化), ⑤ 확대(擴大)"
"item": "① 기술(技術), ② 도약(跳躍), ③ 동향(動向), ④ 역량(力量), ⑤ 혁신(革新)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지기시작')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'성과신뢰')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…기점으로 시작하는 약해지기 현상을…)>'시작하는' / '약해지기' 순서바꿈"
"item": "문구 (…이러한 업무는 신뢰성이 정확성과 중요하기 때문에…)>'신뢰성이 / 정확성과' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'취업기회')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'기회')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…청년들의 취협 기회도…)>'' → '' 글자바꿈"
"item": "문구 (…도약(跳躍)을 위한 발전 기획를 맞이하고…)>'' → '' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "OECD 주요국 합계출산율",
"value": "궁서",
"searchValue": "전문사무 자격증 취득자 현황",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (OECD 주요국 합계출산율)/① 글씨체 (궁서)"
"item": "제목 문구 (전문사무 자격증 취득자 현황)/① 글씨체 (돋움체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "OECD 주요국 합계출산율",
"searchValue": "전문사무 자격증 취득자 현황",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (OECD 주요국 합계출산율)/② 크기 (1200)"
"item": "제목 문구 (전문사무 자격증 취득자 현황)/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "OECD 주요국 합계출산율",
"searchValue": "전문사무 자격증 취득자 현황",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (OECD 주요국 합계출산율)/③ 진하게"
"item": "제목 문구 (전문사무 자격증 취득자 현황)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "OECD 주요국 합계출산율",
"searchValue": "전문사무 자격증 취득자 현황",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (OECD 주요국 합계출산율)/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (전문사무 자격증 취득자 현황)/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "247,159,100",
"value": "191,240,173",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:247,159,100)"
"item": "위쪽 제목 셀/① 색상(RGB:191,240,173)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -682,11 +682,11 @@
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "돋움체",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (돋움체)",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
@@ -705,7 +705,7 @@
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "꺾은선형",
"chart_type": "묶은 세로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (꺾은선형)",
"item": "① 종류 (묶은 세로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "OECD 주요국 합계출산율",
"value": "돋움",
"searchValue": "전문사무 자격증 취득 현황",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (OECD 주요국 합계출산율)/① 글씨체 (돋움)"
"item": "제목 문구 (전문사무 자격증 취득 현황)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "OECD 주요국 합계출산율",
"searchValue": "전문사무 자격증 취득 현황",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (OECD 주요국 합계출산율)/② 크기 (1300)"
"item": "제목 문구 (전문사무 자격증 취득 현황)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "OECD 주요국 합계출산율",
"searchValue": "전문사무 자격증 취득 현황",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (OECD 주요국 합계출산율)/③ 기울임",
"item": "제목 문구 (전문사무 자격증 취득 현황)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "굴림체",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (굴림체)"
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "굴림체",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (굴림체)"
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "굴림체",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (굴림체)"
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

View File

@@ -46,65 +46,65 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "디지털문서편집컨퍼런스",
"value": "견고딕",
"searchValue": "슬기로운국제사진공모전",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/① 글씨체 (견고딕)"
"item": "문구 (슬기로운국제사진공모전)/① 글씨체 (궁서체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "디지털문서편집컨퍼런스",
"value": "28,61,98",
"searchValue": "슬기로운국제사진공모전",
"value": "31,178,161",
"points": 2,
"category": "Color",
"item": "문구 (디지털문서편집컨퍼런스)/② 채우기 : 색상(RGB:28,61,98)"
"item": "문구 (슬기로운국제사진공모전)/② 채우기 : 색상(RGB:31,178,161)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "디지털문서편집컨퍼런스",
"searchValue": "슬기로운국제사진공모전",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털문서편집컨퍼런스)/③ 크기-너비 (120 mm)"
"item": "문구 (슬기로운국제사진공모전)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "디지털문서편집컨퍼런스",
"searchValue": "슬기로운국제사진공모전",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털문서편집컨퍼런스)/④ 크기-높이 (20 mm)"
"item": "문구 (슬기로운국제사진공모전)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "디지털문서편집컨퍼런스",
"searchValue": "슬기로운국제사진공모전",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (슬기로운국제사진공모전)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "디지털문서편집컨퍼런스",
"searchValue": "슬기로운국제사진공모전",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (슬기로운국제사진공모전)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "디지털문서편집컨퍼런스",
"searchValue": "슬기로운국제사진공모전",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (디지털문서편집컨퍼런스)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (슬기로운국제사진공모전)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,23 +116,23 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"value": "중고딕",
"searchValue": "",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (중고딕)"
"item": "어/② 글씨체 (돋움)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "157,92,187",
"searchValue": "",
"value": "214,150,244",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:157,92,187)"
"item": "어/③ 면색 : 색상(RGB:214,150,244)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,39 +141,39 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 세미나와 전시",
"value": "BOLD",
"searchValue": "일반 대중에게 공개",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 세미나와 전시)/① BOLD"
"item": "문구 (일반 대중에게 공개)/① ITALIC"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 세미나와 전시",
"searchValue": "일반 대중에게 공개",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 세미나와 전시)/② UNDERLINE"
"item": "문구 (일반 대중에게 공개)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "",
"char2": "",
"char1": "",
"char2": "",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① , ② , ③ ※"
"item": "① , ② , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "굴림",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 ( 행사안내 )/① 글씨체 (굴림)"
"item": "문구 ( 행사안내 )/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
@@ -181,86 +181,86 @@
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678)",
"value": "ITALIC",
"searchValue": "양재 미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678))/① ITALIC"
"item": "문구 (양재 미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678)",
"value": "UNDERLINE",
"searchValue": "양재 미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678))/② UNDERLINE"
"item": "문구 (양재 미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 12. 20.",
"value": "1400",
"searchValue": "2026. 02. 28.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/① 크기 (1400)",
"item": "문구 (2026. 02. 28.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 02. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 02. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "사단법인 스마트오피스협의회",
"value": "돋움체",
"searchValue": "양재 미디어센터",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (사단법인 스마트오피스협의회)/① 글씨체 (돋움체)"
"item": "문구 (양재 미디어센터)/① 글씨체 (굴림)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "사단법인 스마트오피스협의회",
"value": "2700",
"searchValue": "양재 미디어센터",
"value": "2300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (사단법인 스마트오피스협의회)/② 크기 (2700)"
"item": "문구 (양재 미디어센터)/② 크기 (2300)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "사단법인 스마트오피스협의회",
"searchValue": "양재 미디어센터",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (사단법인 스마트오피스협의회)/③ 정렬 (가운데 정렬)"
"item": "문구 (양재 미디어센터)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "궁서",
"value": "중고딕",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (궁서)"
"item": "문구 (DIAT)/① 글꼴 (중고딕)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -280,10 +280,10 @@
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "Ideograph",
"value": "RomanCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"item": "① 쪽 번호 매기기 (I,II,III 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -308,7 +308,7 @@
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"value": "BottomLeft",
"points": 2,
"category": "PageNumber",
"item": "왼쪽 아래",
@@ -330,11 +330,11 @@
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"first_word": "",
"value": "180",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "70",
"value": "60",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (된장의 역사와 종류)/① 크기-너비 (70 mm)"
"item": "문구 (사진 예술 산업)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (된장의 역사와 종류)/② 크기-높이 (12 mm)"
"item": "문구 (사진 예술 산업)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,7 +387,7 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (된장의 역사와 종류)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (사진 예술 산업)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
@@ -395,43 +395,43 @@
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (된장의 역사와 종류)/④ 글상자 모서리 (반원)",
"item": "문구 (사진 예술 산업)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "227,220,193",
"value": "228,211,147",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (된장의 역사와 종류)/⑤ 채우기 : 색상(RGB:227,220,193)"
"item": "문구 (사진 예술 산업)/⑤ 채우기 : 색상(RGB:228,211,147)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (된장의 역사와 종류)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (사진 예술 산업)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (된장의 역사와 종류)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (사진 예술 산업)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "맑은 고딕",
"value": "고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (된장의 역사와 종류)/⑧ 글씨체 (맑은 고딕)"
"item": "문구 (사진 예술 산업)/⑧ 글씨체 (고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (된장의 역사와 종류)/⑨ 글씨크기 (2000)",
"item": "문구 (사진 예술 산업)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,14 +439,14 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (된장의 역사와 종류)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (사진 예술 산업)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"item": "① 파일명 \"그림C.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
@@ -479,80 +479,80 @@
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 디지털 문서 편집 기술",
"value": "중고딕",
"searchValue": "1. 현대 사진 예술",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 디지털 문서 편집 기술)/① 글씨체 (중고딕)"
"item": "문구① (1. 현대 사진 예술)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 디지털 문서 편집 기술",
"searchValue": "1. 현대 사진 예술",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 디지털 문서 편집 기술)/② 크기 (1200)"
"item": "문구① (1. 현대 사진 예술)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 디지털 문서 편집 기술",
"searchValue": "1. 현대 사진 예술",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 디지털 문서 편집 기술)/③ 진하게"
"item": "문구① (1. 현대 사진 예술)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 문서 자동화 솔루션",
"value": "중고딕",
"searchValue": "2. 사진 산업의 가치",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 문서 자동화 솔루션)/① 글씨체 (중고딕)"
"item": "문구② (2. 사진 산업의 가치)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 문서 자동화 솔루션",
"searchValue": "2. 사진 산업의 가치",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 문서 자동화 솔루션)/② 크기 (1200)"
"item": "문구② (2. 사진 산업의 가치)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 문서 자동화 솔루션",
"searchValue": "2. 사진 산업의 가치",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 문서 자동화 솔루션)/③ 진하게"
"item": "문구② (2. 사진 산업의 가치)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "전자 서명",
"option": "스토리텔링",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (전자 서명)/① 각주 설정 및 문구 입력"
"item": "문구 (스토리텔링)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지해 사용되는 기술",
"value": "돋움",
"searchValue": "알리고자 하는 바를 단어, 이미지, 소리해 사건, 이야기로 전달하는 것을 의미함",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (전자 서명)/② 글씨체 (돋움)"
"item": "문구 (스토리텔링)/② 글씨체 (중고딕)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지해 사용되는 기술",
"searchValue": "알리고자 하는 바를 단어, 이미지, 소리해 사건, 이야기로 전달하는 것을 의미함",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전자 서명)/③ 크기 (9pt)"
"item": "문구 (스토리텔링)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지해 사용되는 기술",
"searchValue": "알리고자 하는 바를 단어, 이미지, 소리해 사건, 이야기로 전달하는 것을 의미함",
"value": "CircledDigit",
"points": 2,
"category": "OneAnswer",
@@ -580,80 +580,80 @@
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Security",
"ignoreWord": "Documentary",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Security/영단어 미입력, 대소문자/오타 시 전체 감점",
"item": "Documentary/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["초안", "草案"],
["진위", "眞僞"],
["탑재", "搭載"],
["자", "自動"],
["극대화", "極大化"]
["표현", "表現"],
["합성", "合成"],
["보정", "補正"],
["자", "投資"],
["각광", "脚光"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 초안(草案), ② 진위(眞僞), ③ 탑재(搭載), ④ 자동(自動), ⑤ 극대화(極大化)"
"item": "① 표현(表現), ② 합성(合成), ③ 보정(補正), ④ 투자(投資), ⑤ 각광(脚光)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'간과비용')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지능이자동')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…대체하면서 비용이 시간과 절감될…)>'비용이 / 시간과' 순서바꿈"
"item": "문구 (…자동으로 인공지능이 이미지 보정…)>'자동으로 / 인공지능이' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'이필요한')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'육적측면')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…인력 투입이 필요해 수작업…)>'' → '' 글자바꿈"
"item": "문구 (…상업적, 교육적 측변에서도…)>'' → '' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "굴림체",
"searchValue": "사진 산업 시장 성장률",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/① 글씨체 (굴림체)"
"item": "제목 문구 (사진 산업 시장 성장률)/① 글씨체 (궁서)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "1100",
"searchValue": "사진 산업 시장 성장률",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/② 크기 (1100)"
"item": "제목 문구 (사진 산업 시장 성장률)/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"searchValue": "사진 산업 시장 성장률",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/③ 진하게"
"item": "제목 문구 (사진 산업 시장 성장률)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"searchValue": "사진 산업 시장 성장률",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (연령별 축제 만족도(단위:%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,174,43",
"value": "165,211,137",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,174,43)"
"item": "위쪽 제목 셀/① 색상(RGB:165,211,137)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -704,7 +704,7 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "묶은 가로 막대형",
"chart_type": "곡선이 있는 분산형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은 가로 막대형)",
"item": "① 종류 (곡선이 있는 분산형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "디지털 문서 편집 기술 성장률",
"value": "휴먼옛체",
"searchValue": "사진 산업 시장 성장률",
"value": "바탕",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/① 글씨체 (휴먼옛체)"
"item": "제목 문구 (사진 산업 시장 성장률)/① 글씨체 (바탕)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "디지털 문서 편집 기술 성장률",
"value": "1200",
"searchValue": "사진 산업 시장 성장률",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/② 크기 (1200)"
"item": "제목 문구 (사진 산업 시장 성장률)/② 크기 (1400)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "디지털 문서 편집 기술 성장률",
"searchValue": "사진 산업 시장 성장률",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/③ 기울임",
"item": "제목 문구 (사진 산업 시장 성장률)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "궁서",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (궁서)"
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "궁서",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (궁서)"
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "궁서",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (궁서)"
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

841
JSON/2602/DIW_2602D.json Normal file
View File

@@ -0,0 +1,841 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "전국대학생창업아이디어공모전",
"value": "돋움체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전국대학생창업아이디어공모전)/① 글씨체 (돋움체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "전국대학생창업아이디어공모전",
"value": "28,77,128",
"points": 2,
"category": "Color",
"item": "문구 (전국대학생창업아이디어공모전)/② 채우기 : 색상(RGB:28,77,128)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "전국대학생창업아이디어공모전",
"value": "130",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (전국대학생창업아이디어공모전)/③ 크기-너비 (130 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "전국대학생창업아이디어공모전",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (전국대학생창업아이디어공모전)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "전국대학생창업아이디어공모전",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전국대학생창업아이디어공모전)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "전국대학생창업아이디어공모전",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전국대학생창업아이디어공모전)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "전국대학생창업아이디어공모전",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (전국대학생창업아이디어공모전)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "미",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "미",
"value": "바탕체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (바탕체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "미",
"value": "187,196,219",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:187,196,219)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "미",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "새로운 도전, 창업으로 실현하다",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (새로운 도전, 창업으로 실현하다)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "새로운 도전, 창업으로 실현하다",
"value": "UNDERLINE",
"points": 2,
"category": "FontAttribute",
"item": "문구 (새로운 도전, 창업으로 실현하다)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "■",
"char2": "■",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ■ , ② ■ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (■ 행사안내 ■)/① 글씨체 (중고딕)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (■ 행사안내 ■)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026.03.03.(화) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026.03.03.(화) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/① ITALIC"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026.03.03.(화) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026.03.03.(화) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 02. 28.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 02. 28.)/① 크기 (1400)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 02. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 02. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "전국청년창업진흥원",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (전국청년창업진흥원)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "전국청년창업진흥원",
"value": "2700",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전국청년창업진흥원)/② 크기 (2700)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "전국청년창업진흥원",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전국청년창업진흥원)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "궁서",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (궁서)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "Ideograph",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (一,二,三 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "200",
"first_word": "미",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 200% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "70",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (대학생 창업 현황)/① 크기-너비 (70 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (대학생 창업 현황)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (대학생 창업 현황)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (대학생 창업 현황)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "227,142,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (대학생 창업 현황)/⑤ 채우기 : 색상(RGB:227,142,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (대학생 창업 현황)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (대학생 창업 현황)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "맑은고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (대학생 창업 현황)/⑧ 글씨체 (맑은고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (대학생 창업 현황)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (대학생 창업 현황)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림D.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 대학생 창업",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 대학생 창업)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 대학생 창업",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 대학생 창업)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 대학생 창업",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 대학생 창업)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 창업 생태계",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 창업 생태계)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 창업 생태계",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 창업 생태계)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 창업 생태계",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 창업 생태계)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "펀딩",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (펀딩)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "필요, 프로그램, 프로젝트에 자금을 조달하기 위해 자원을 제공하는 행위를 말한다.",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (펀딩)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "필요, 프로그램, 프로젝트에 자금을 조달하기 위해 자원을 제공하는 행위를 말한다.",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (펀딩)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "필요, 프로그램, 프로젝트에 자금을 조달하기 위해 자원을 제공하는 행위를 말한다.",
"value": "LatinSmall",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Incubation",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Incubation/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["창업", "創業"],
["육성", "育成"],
["기회", "機會"],
["투자", "投資"],
["고용", "雇用"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 창업(創業), ② 육성(育成), ③ 기회(機會), ④ 투자(投資), ⑤ 고용(雇用)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지능,빅데')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (...최근에는 빅데이터, 인공지능, 블록체인 등...)>'빅데이터, / 인공지능,' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'스모델이')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (...혁신적인 비즈니스 모형이...)>'형→델' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "대학생 창업 분야별 성장률(%)",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (대학생 창업 분야별 성장률(%))/① 글씨체 (궁서체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "대학생 창업 분야별 성장률(%)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (대학생 창업 분야별 성장률(%))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "대학생 창업 분야별 성장률(%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (대학생 창업 분야별 성장률(%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "대학생 창업 분야별 성장률(%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (대학생 창업 분야별 성장률(%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "213,178,100",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:213,178,100)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "100% 기준 누적 가로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (100% 기준 누적 가로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (80 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "대학생 창업 분야별 성장률",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (대학생 창업 분야별 성장률)/① 글씨체 (휴먼옛체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "대학생 창업 분야별 성장률",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (대학생 창업 분야별 성장률)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "대학생 창업 분야별 성장률",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (대학생 창업 분야별 성장률)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (굴림체)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (굴림체)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (굴림체)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

841
JSON/2602/DIW_2602E.json Normal file
View File

@@ -0,0 +1,841 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "상반기건강차체험안내",
"value": "돋움체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (상반기건강차체험안내)/① 글씨체 (돋움체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "상반기건강차체험안내",
"value": "55,123,200",
"points": 2,
"category": "Color",
"item": "문구 (상반기건강차체험안내)/② 채우기 : 색상(RGB:55,123,200)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "상반기건강차체험안내",
"value": "125",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (상반기건강차체험안내)/③ 크기-너비 (125 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "상반기건강차체험안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (상반기건강차체험안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "상반기건강차체험안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (상반기건강차체험안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "상반기건강차체험안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (상반기건강차체험안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "상반기건강차체험안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (상반기건강차체험안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "차",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "차",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (굴림체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "차",
"value": "231,215,17",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:231,215,17)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "차",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "새로운 취미를 가질 수 있는 기회",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (새로운 취미를 가질 수 있는 기회)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "새로운 취미를 가질 수 있는 기회",
"value": "ITALIC",
"points": 2,
"category": "FontAttribute",
"item": "문구 (새로운 취미를 가질 수 있는 기회)/② ITALIC"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "◇",
"char2": "◇",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ◇ , ② ◇ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "체험안내",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (◇ 체험안내 ◇)/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "체험안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (◇ 체험안내 ◇)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울시 청담동 서울필문화센터 1층",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서울시 청담동 서울필문화센터 1층)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울시 청담동 서울필문화센터 1층",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서울시 청담동 서울필문화센터 1층)/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 02. 28.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 02. 28.)/① 크기 (1400)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 02. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 02. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "서울필문화센터",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (서울필문화센터)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "서울필문화센터",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (서울필문화센터)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "서울필문화센터",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (서울필문화센터)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (A,B,C 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "200",
"first_word": "차",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 200% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "60",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (홍차에 대하여)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (홍차에 대하여)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (홍차에 대하여)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (홍차에 대하여)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "241,183,180",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (홍차에 대하여)/⑤ 채우기 : 색상(RGB:241,183,180)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (홍차에 대하여)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (홍차에 대하여)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "견고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (홍차에 대하여)/⑧ 글씨체 (견고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (홍차에 대하여)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (홍차에 대하여)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림E.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 홍차의 역사",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구① (1. 홍차의 역사)/① 글씨체 (중고딕)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 홍차의 역사",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 홍차의 역사)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 홍차의 역사",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 홍차의 역사)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 홍차의 효능",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구② (2. 홍차의 효능)/① 글씨체 (중고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 홍차의 효능",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 홍차의 효능)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 홍차의 효능",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 홍차의 효능)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "효소",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (효소)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "세포 안에서 합성되어 촉매 구실을 하는 화합물",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (효소)/② 글씨체 (굴림)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "세포 안에서 합성되어 촉매 구실을 하는 화합물",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (효소)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "세포 안에서 합성되어 촉매 구실을 하는 화합물",
"value": "Digit",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Culture",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Culture/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["홍차", "紅茶"],
["추정", "推定"],
["재배", "栽培"],
["특징", "特徵"],
["건강", "健康"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 홍차(紅茶), ② 추정(推定), ③ 재배(栽培), ④ 특징(特徵), ⑤ 건강(健康)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'세기중반')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…17제기 중반 네덜란드와…)>'제' → '세' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'산된홍차')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…홍차는 생산된 세계적으로 유명해졌다는…)>'홍차는 / 생산된' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "국내 홍차 선호도(%)",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (국내 홍차 선호도(%))/① 글씨체 (돋움체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "국내 홍차 선호도(%)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (국내 홍차 선호도(%))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "국내 홍차 선호도(%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (국내 홍차 선호도(%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "국내 홍차 선호도(%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (국내 홍차 선호도(%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "251,244,70",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:251,244,70)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "꺾은선형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (꺾은선형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "국내 홍차 선호도",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (국내 홍차 선호도)/① 글씨체 (휴먼옛체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "국내 홍차 선호도",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (국내 홍차 선호도)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "국내 홍차 선호도",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (국내 홍차 선호도)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -46,57 +46,57 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "청소년창작음악페스티벌",
"value": "궁서체",
"searchValue": "전통주페어링특강안내",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (청소년창작음악페스티벌)/① 글씨체 (궁서체)"
"item": "문구 (전통주페어링특강안내)/① 글씨체 (휴먼옛체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "청소년창작음악페스티벌",
"value": "48,117,97",
"searchValue": "전통주페어링특강안내",
"value": "28,145,110",
"points": 2,
"category": "Color",
"item": "문구 (청소년창작음악페스티벌)/② 채우기 : 색상(RGB:48,117,97)"
"item": "문구 (전통주페어링특강안내)/② 채우기 : 색상(RGB:28,145,110)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "청소년창작음악페스티벌",
"value": "110",
"searchValue": "전통주페어링특강안내",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (청소년창작음악페스티벌)/③ 크기-너비 (110 mm)"
"item": "문구 (전통주페어링특강안내)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "청소년창작음악페스티벌",
"searchValue": "전통주페어링특강안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (청소년창작음악페스티벌)/④ 크기-높이 (20 mm)"
"item": "문구 (전통주페어링특강안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "청소년창작음악페스티벌",
"searchValue": "전통주페어링특강안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (청소년창작음악페스티벌)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (전통주페어링특강안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "청소년창작음악페스티벌",
"searchValue": "전통주페어링특강안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (청소년창작음악페스티벌)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (전통주페어링특강안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "청소년창작음악페스티벌",
"searchValue": "전통주페어링특강안내",
"value": true,
"points": 2,
"category": "Boolean",
@@ -104,7 +104,7 @@
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,23 +116,23 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"value": "굴림체",
"searchValue": "",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (굴림체)"
"item": "어/② 글씨체 (돋움체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "248,132,58",
"searchValue": "",
"value": "250,167,83",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:248,132,58)"
"item": "어/③ 면색 : 색상(RGB:250,167,83)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,19 +141,19 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "행사의 주제는 ‘음악, 꿈을 노래하다’",
"searchValue": "한식에 가장 잘 어울리는 전통주를 추천",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (행사의 주제는 ‘음악, 꿈을 노래하다’)/① BOLD"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "행사의 주제는 ‘음악, 꿈을 노래하다’",
"searchValue": "한식에 가장 잘 어울리는 전통주를 추천",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (행사의 주제는 ‘음악, 꿈을 노래하다’)/② UNDERLINE"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
@@ -186,73 +186,73 @@
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "자세한 내용은 홈페이지(http://www.ihd.or.kr)에서 확인",
"searchValue": "서울 목동 현대백화점 요리실 1호, 2호, 3호",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자세한 내용은 홈페이지(http://www.ihd.or.kr)에서 확인)/① BOLD"
"item": "문구 (서울 목동 현대백화점 요리실 1호, 2호, 3호)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "자세한 내용은 홈페이지(http://www.ihd.or.kr)에서 확인",
"searchValue": "서울 목동 현대백화점 요리실 1호, 2호, 3호",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자세한 내용은 홈페이지(http://www.ihd.or.kr)에서 확인)/② ITALIC"
"item": "문구 (서울 목동 현대백화점 요리실 1호, 2호, 3호)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 03. 28.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/① 크기 (1300)",
"item": "문구 (2026. 03. 28.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 03. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 03. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "청소년 창작 음악 사무국",
"value": "돋움",
"searchValue": "대한민국전통주살리기협회",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (청소년 창작 음악 사무국)/① 글씨체 (돋움)"
"item": "문구 (대한민국전통주살리기협회)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "청소년 창작 음악 사무국",
"searchValue": "대한민국전통주살리기협회",
"value": "2700",
"points": 1,
"category": "OneAnswer",
"item": "문구 (청소년 창작 음악 사무국)/② 크기 (2700)"
"item": "문구 (대한민국전통주살리기협회)/② 크기 (2700)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "청소년 창작 음악 사무국",
"searchValue": "대한민국전통주살리기협회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (청소년 창작 음악 사무국)/③ 정렬 (가운데 정렬)"
"item": "문구 (대한민국전통주살리기협회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
@@ -308,10 +308,10 @@
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "오른쪽 아래",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
@@ -330,11 +330,11 @@
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "180",
"first_word": "",
"value": "190",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 180% 설정",
"item": "문제 1 줄간격 190% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "60",
"value": "55",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (청소년 음악 창작)/① 크기-너비 (60 mm)"
"item": "문구 (한국의 전통주)/① 크기-너비 (55 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (청소년 음악 창작)/② 크기-높이 (12 mm)"
"item": "문구 (한국의 전통주)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,7 +387,7 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (청소년 음악 창작)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (한국의 전통주)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
@@ -395,43 +395,43 @@
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (청소년 음악 창작)/④ 글상자 모서리 (반원)",
"item": "문구 (한국의 전통주)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "53,135,145",
"value": "119,214,225",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (청소년 음악 창작)/⑤ 채우기 : 색상(RGB:53,135,145)"
"item": "문구 (한국의 전통주)/⑤ 채우기 : 색상(RGB:119,214,225)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (청소년 음악 창작)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (한국의 전통주)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (청소년 음악 창작)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (한국의 전통주)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "궁서체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (청소년 음악 창작)/⑧ 글씨체 (궁서체)"
"item": "문구 (한국의 전통주)/⑧ 글씨체 (궁서체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (청소년 음악 창작)/⑨ 글씨크기 (2000)",
"item": "문구 (한국의 전통주)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,22 +439,22 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (청소년 음악 창작)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (한국의 전통주)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림B.jpg\" 삽입",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
@@ -479,84 +479,84 @@
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 청소년 음악 창작",
"value": "돋움",
"searchValue": "1. 한국 전통주",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 청소년 음악 창작)/① 글씨체 (돋움)"
"item": "문구① (1. 한국 전통주)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 청소년 음악 창작",
"searchValue": "1. 한국 전통주",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 청소년 음악 창작)/② 크기 (1200)"
"item": "문구① (1. 한국 전통주)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 청소년 음악 창작",
"searchValue": "1. 한국 전통주",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 청소년 음악 창작)/③ 진하게"
"item": "문구① (1. 한국 전통주)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 청소년 음악 산업",
"value": "돋움",
"searchValue": "2. 패러다임 바뀐 음주 문화",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 청소년 음악 산업)/① 글씨체 (돋움)"
"item": "문구② (2. 패러다임 바뀐 음주 문화)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 청소년 음악 산업",
"searchValue": "2. 패러다임 바뀐 음주 문화",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 청소년 음악 산업)/② 크기 (1200)"
"item": "문구② (2. 패러다임 바뀐 음주 문화)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 청소년 음악 산업",
"searchValue": "2. 패러다임 바뀐 음주 문화",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 청소년 음악 산업)/③ 진하게"
"item": "문구② (2. 패러다임 바뀐 음주 문화)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "스트리밍",
"option": "MZ세대",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (스트리밍)/① 각주 설정 및 문구 입력"
"item": "문구 (MZ세대)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "인터넷에 연결된 장치에서 동영상이나 음악 등의 콘텐츠를 재생하는 기술을 의미함",
"searchValue": "밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (스트리밍)/② 글씨체 (굴림)"
"item": "문구 (MZ세대)/② 글씨체 (굴림)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "인터넷에 연결된 장치에서 동영상이나 음악 등의 콘텐츠를 재생하는 기술을 의미함",
"searchValue": "밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (스트리밍)/③ 크기 (9pt)"
"item": "문구 (MZ세대)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "인터넷에 연결된 장치에서 동영상이나 음악 등의 콘텐츠를 재생하는 기술을 의미함",
"searchValue": "밀레니얼 세대와 Z세대를 통틀어 지칭하는 신조어",
"value": "CircledHangulJamo",
"points": 2,
"category": "OneAnswer",
"item": "문구 (스트리밍)/④ 각주 번호모양",
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -579,73 +579,73 @@
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Artist')])",
"ignoreWord": "Artist",
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Paradigm",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Artist/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
"item": "Paradigm/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["작곡", "作曲"],
["유통", "流通"],
["창작", "創作"],
["발표", "發表"],
["수익", "受益"]
["양조", "釀造"],
["노동자", "勞動者"],
["문인", "文人"],
["백주", "白酒"],
["음미", "吟味"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 작곡(作曲), ② 유통(流通), ③ 창작(創作), ④ 발표(發表), ⑤ 수익(受益)"
"item": "① 양조(釀造), ② 노동자(勞動者), ③ 문인(文人), ④ 백주(白酒), ⑤ 음미(吟味)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'이고실험')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'에도막걸')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…벗어나 자율적이구 실험적인…)>'' → '' 글자바꿈"
"item": "문구 (…문인(文人)들의 문집에토 막걸리로…)>'' → '' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'로운기회')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'하는문화')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…뮤지션들에게도 기회가 새로운 열리고…)>'기회가 / 새로운' 순서바꿈"
"item": "문구 (…마시고 문화에서 취하는 술의 맛과…)>'문화에서' / '취하는' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "청소년 음악 성장률(단위:%)",
"value": "돋움",
"searchValue": "월평균 주종별 음주(단위:%)",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/① 글씨체 (돋움)"
"item": "제목 문구 (월평균 주종별 음주(단위:%))/① 글씨체 (돋움)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "청소년 음악 성장률(단위:%)",
"searchValue": "월평균 주종별 음주(단위:%)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/② 크기 (1200)"
"item": "제목 문구 (월평균 주종별 음주(단위:%))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "청소년 음악 성장률(단위:%)",
"searchValue": "월평균 주종별 음주(단위:%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/③ 진하게"
"item": "제목 문구 (월평균 주종별 음주(단위:%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "청소년 음악 성장률(단위:%)",
"searchValue": "월평균 주종별 음주(단위:%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (월평균 주종별 음주(단위:%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
@@ -704,8 +704,8 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "꺾은선형",
"chart_type": "곡선이 있는 분산형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (꺾은선형)",
"item": "① 종류 (곡선이 있는 분산형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "청소년 음악 성장률(단위:%)",
"value": "맑은 고딕",
"searchValue": "월평균 주종별 음주",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/① 글씨체 (맑은 고딕)"
"item": "제목 문구 (월평균 주종별 음주)/① 글씨체 (궁서)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "청소년 음악 성장률(단위:%)",
"searchValue": "월평균 주종별 음주",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/② 크기 (1300)"
"item": "제목 문구 (월평균 주종별 음주)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "청소년 음악 성장률(단위:%)",
"searchValue": "월평균 주종별 음주",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (청소년 음악 성장률(단위:%))/③ 기울임",
"item": "제목 문구 (월평균 주종별 음주)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (바탕)"
"item": "X축/① 글꼴 (맑은 고딕)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (바탕)"
"item": "Y축/① 글꼴 (맑은 고딕)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "맑은 고딕",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (바탕)"
"item": "범례/① 글꼴 (맑은 고딕)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

View File

@@ -46,65 +46,65 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "전국제과제빵박람회",
"value": "견고딕",
"searchValue": "슬기로운미디어생활특강안내",
"value": "돋움체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전국제과제빵박람회)/① 글씨체 (견고딕)"
"item": "문구 (슬기로운미디어생활특강안내)/① 글씨체 (돋움체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "전국제과제빵박람회",
"value": "49,95,151",
"searchValue": "슬기로운미디어생활특강안내",
"value": "146,44,137",
"points": 2,
"category": "Color",
"item": "문구 (전국제과제빵박람회)/② 채우기 : 색상(RGB:49,95,151)"
"item": "문구 (슬기로운미디어생활특강안내)/② 채우기 : 색상(RGB:146,44,137)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "전국제과제빵박람회",
"value": "110",
"searchValue": "슬기로운미디어생활특강안내",
"value": "130",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (전국제과제빵박람회)/③ 크기-너비 (110 mm)"
"item": "문구 (슬기로운미디어생활특강안내)/③ 크기-너비 (130 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "전국제과제빵박람회",
"searchValue": "슬기로운미디어생활특강안내",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (전국제과제빵박람회)/④ 크기-높이 (20 mm)"
"item": "문구 (슬기로운미디어생활특강안내)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "전국제과제빵박람회",
"searchValue": "슬기로운미디어생활특강안내",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전국제과제빵박람회)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (슬기로운미디어생활특강안내)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "전국제과제빵박람회",
"searchValue": "슬기로운미디어생활특강안내",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전국제과제빵박람회)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (슬기로운미디어생활특강안내)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "전국제과제빵박람회",
"searchValue": "슬기로운미디어생활특강안내",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (전국제과제빵박람회)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (슬기로운미디어생활특강안내)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,7 +116,7 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"searchValue": "",
"value": "궁서",
"points": 1,
"category": "FontName",
@@ -124,15 +124,15 @@
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "66,227,189",
"searchValue": "",
"value": "172,235,62",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:66,227,189)"
"item": "어/③ 면색 : 색상(RGB:172,235,62)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,39 +141,39 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "국내 유일의 제과제빵 전문 박람회",
"value": "BOLD",
"searchValue": "동영상 콘텐츠의 현재와 미래",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (국내 유일의 제과제빵 전문 박람회)/① BOLD"
"item": "문구 (동영상 콘텐츠의 현재와 미래)/① ITALIC"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "국내 유일의 제과제빵 전문 박람회",
"searchValue": "동영상 콘텐츠의 현재와 미래",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (국내 유일의 제과제빵 전문 박람회)/② UNDERLINE"
"item": "문구 (동영상 콘텐츠의 현재와 미래)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "",
"char2": "",
"char1": "",
"char2": "",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① , ② , ③ ※"
"item": "① , ② , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "굴림",
"value": "맑은 고딕",
"points": 1,
"category": "FontName",
"item": "문구 ( 행사안내 )/① 글씨체 (굴림)"
"item": "문구 ( 행사안내 )/① 글씨체 (맑은 고딕)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
@@ -181,86 +181,86 @@
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "홈페이지(http://www.ihd.or.kr) 게시판 또는 전화(02-123-4567) 접수",
"searchValue": "중랑미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (홈페이지(http://www.ihd.or.kr) 게시판 또는 전화(02-123-4567) 접수)/① BOLD"
"item": "문구 (중랑미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "홈페이지(http://www.ihd.or.kr) 게시판 또는 전화(02-123-4567) 접수",
"searchValue": "중랑미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (홈페이지(http://www.ihd.or.kr) 게시판 또는 전화(02-123-4567) 접수)/② ITALIC"
"item": "문구 (중랑미디어센터 홈페이지(http://www.ihd.or.kr) 슬기로운 미디어 생활)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 12,
"Indent": 10
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (12), 내어쓰기 (10)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 01. 24.",
"searchValue": "2026. 03. 28.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 01. 24.)/① 크기 (1300)",
"item": "문구 (2026. 03. 28.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 01. 24.",
"searchValue": "2026. 03. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 01. 24.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 03. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "대한제과제빵협회",
"value": "궁서체",
"searchValue": "중랑미디어센터",
"value": "휴먼옛체",
"points": 1,
"category": "FontName",
"item": "문구 (대한제과제빵협회)/① 글씨체 (궁서체)"
"item": "문구 (중랑미디어센터)/① 글씨체 (휴먼옛체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "대한제과제빵협회",
"value": "2200",
"searchValue": "중랑미디어센터",
"value": "2300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대한제과제빵협회)/② 크기 (2200)"
"item": "문구 (중랑미디어센터)/② 크기 (2300)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "대한제과제빵협회",
"searchValue": "중랑미디어센터",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (대한제과제빵협회)/③ 정렬 (가운데 정렬)"
"item": "문구 (중랑미디어센터)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"value": "중고딕",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
"item": "문구 (DIAT)/① 글꼴 (중고딕)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -280,10 +280,10 @@
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "LatinCapital",
"value": "RomanCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"item": "① 쪽 번호 매기기 (I,II,III 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -308,7 +308,7 @@
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"value": "BottomLeft",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
@@ -331,7 +331,7 @@
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"first_word": "",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "50",
"value": "60",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (제과제빵)/① 크기-너비 (50 mm)"
"item": "문구 (방송 콘텐츠)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (제과제빵)/② 크기-높이 (12 mm)"
"item": "문구 (방송 콘텐츠)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,51 +387,51 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (제과제빵)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (방송 콘텐츠)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "20",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (제과제빵)/④ 글상자 모서리 (둥근모양)",
"item": "문구 (방송 콘텐츠)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "202,86,167",
"value": "227,220,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (제과제빵)/⑤ 채우기 : 색상(RGB:202,86,167)"
"item": "문구 (방송 콘텐츠)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (제과제빵)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (방송 콘텐츠)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (제과제빵)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (방송 콘텐츠)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "돋움체",
"value": "견고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (제과제빵)/⑧ 글씨체 (돋움체)"
"item": "문구 (방송 콘텐츠)/⑧ 글씨체 (견고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (제과제빵)/⑨ 글씨크기 (2000)",
"item": "문구 (방송 콘텐츠)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,7 +439,7 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (제과제빵)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (방송 콘텐츠)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
@@ -479,81 +479,81 @@
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 제과제빵이란?",
"searchValue": "1. 최근 콘텐츠 동향",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 제과제빵이란?)/① 글씨체 (돋움)"
"item": "문구① (1. 최근 콘텐츠 동향)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 제과제빵이란?",
"searchValue": "1. 최근 콘텐츠 동향",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 제과제빵이란?)/② 크기 (1200)"
"item": "문구① (1. 최근 콘텐츠 동향)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 제과제빵이란?",
"searchValue": "1. 최근 콘텐츠 동향",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 제과제빵이란?)/③ 진하게"
"item": "문구① (1. 최근 콘텐츠 동향)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 설탕 공예",
"searchValue": "2. OTT 서비스의 미래",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 설탕 공예)/① 글씨체 (돋움)"
"item": "문구② (2. OTT 서비스의 미래)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 설탕 공예",
"searchValue": "2. OTT 서비스의 미래",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 설탕 공예)/② 크기 (1200)"
"item": "문구② (2. OTT 서비스의 미래)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 설탕 공예",
"searchValue": "2. OTT 서비스의 미래",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 설탕 공예)/③ 진하게"
"item": "문구② (2. OTT 서비스의 미래)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "가니쉬",
"option": "코로나",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (가니쉬)/① 각주 설정 및 문구 입력"
"item": "문구 (코로나)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "음식의 외형을 돋보이게 하기 위해 장식 또는 곁들임으로 사용되는 식재료",
"value": "굴림",
"searchValue": "새로운 유형의 바이러스에 의한 급성 호흡기 전염병",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구 (가니쉬)/② 글씨체 (굴림)"
"item": "문구 (코로나)/② 글씨체 (중고딕)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "음식의 외형을 돋보이게 하기 위해 장식 또는 곁들임으로 사용되는 식재료",
"searchValue": "새로운 유형의 바이러스에 의한 급성 호흡기 전염병",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (가니쉬)/③ 크기 (9pt)"
"item": "문구 (코로나)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "음식의 외형을 돋보이게 하기 위해 장식 또는 곁들임으로 사용되는 식재료",
"value": "RomanSmall",
"searchValue": "새로운 유형의 바이러스에 의한 급성 호흡기 전염병",
"value": "DecagonCircle",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
@@ -580,80 +580,80 @@
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Chocolatier",
"ignoreWord": "Streaming",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Chocolatier/영단어 미입력, 대소문자/오타 시 전체 감점",
"item": "Streaming/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["발효", "醱酵"],
["제품", "製品"],
["장식", "裝飾"],
["표현", "表現"],
["경향", "傾向"]
["시청", "視聽"],
["송출", "送出"],
["취향", "趣向"],
["성장", "成長"],
["근절", "根絶"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 발효(醱酵), ② 제품(製品), ③ 장식(裝飾), ④ 표현(表現), ⑤ 경향(傾向) "
"item": "① 시청(視聽), ② 송출(送出), ③ 취향(趣向), ④ 성장(成長), ⑤ 근절(根絶)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'루를사용')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'간에원하')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…보통은 밀가루를 포용하지만…)>'포'→'사' 글자바꿈"
"item": "문구 (…언제든지 원하는 원하는 시간에 순서로…)>'원하는' / '시간에' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'람을불어')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'수익구조')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…뭉치기, 불어넣어 바람을 부풀리기 등의…)>'불어넣어 / 바람을' 순서바꿈"
"item": "문구 (…이익구조가 열악하다.…)>'이' → '수' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "연령별 박람회 참가자 현황(단위:명)",
"searchValue": "동영상 플랫폼 이용률(%)",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (연령별 박람회 참가자 현황(단위:명))/① 글씨체 (굴림체)"
"item": "제목 문구 (동영상 플랫폼 이용률(%))/① 글씨체 (굴림체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "연령별 박람회 참가자 현황(단위:명)",
"value": "1100",
"searchValue": "동영상 플랫폼 이용률(%)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (연령별 박람회 참가자 현황(단위:명))/② 크기 (1100)"
"item": "제목 문구 (동영상 플랫폼 이용률(%))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "연령별 박람회 참가자 현황(단위:명)",
"searchValue": "동영상 플랫폼 이용률(%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (연령별 박람회 참가자 현황(단위:명))/③ 진하게"
"item": "제목 문구 (동영상 플랫폼 이용률(%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "연령별 박람회 참가자 현황(단위:명)",
"searchValue": "동영상 플랫폼 이용률(%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (연령별 박람회 참가자 현황(단위:명))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (동영상 플랫폼 이용률(%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,225,43",
"value": "95,229,218",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,225,43)"
"item": "위쪽 제목 셀/① 색상(RGB:95,229,218)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -682,11 +682,11 @@
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕",
"value": "궁서체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)",
"item": "글자모양/① 글씨체 (궁서체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
@@ -704,8 +704,8 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "묶은 로 막대형",
"chart_type": "묶은 로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은 로 막대형)",
"item": "① 종류 (묶은 로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,32 +753,32 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "연령별 박람회 참가자 현황",
"value": "돋움체",
"searchValue": "동영상 플랫폼 이용률",
"value": "굴림",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (연령별 박람회 참가자 현황)/① 글씨체 (돋움체)"
"item": "제목 문구 (동영상 플랫폼 이용률)/① 글씨체 (굴림)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "연령별 박람회 참가자 현황",
"value": "1300",
"searchValue": "동영상 플랫폼 이용률",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (연령별 박람회 참가자 현황)/② 크기 (1300)"
"item": "제목 문구 (동영상 플랫폼 이용률)/② 크기 (1400)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "연령별 박람회 참가자 현황",
"searchValue": "동영상 플랫폼 이용률",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (연령별 박람회 참가자 현황)/③ 기울임",
"item": "제목 문구 (동영상 플랫폼 이용률)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "바탕체",
"points": 1,
"category": "ChartOneAnswer",
@@ -801,7 +801,7 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "바탕체",
"points": 1,
"category": "ChartOneAnswer",
@@ -824,7 +824,7 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "바탕체",
"points": 1,
"category": "OneAnswer",

View File

@@ -46,61 +46,61 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "한국전통공예박람회",
"value": "굴림체",
"searchValue": "천혜의비경철쭉",
"value": "맑은고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국전통공예박람회)/① 글씨체 (굴림체)"
"item": "문구 (천혜의비경철쭉)/① 글씨체 (맑은고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "한국전통공예박람회",
"value": "28,61,98",
"searchValue": "천혜의비경철쭉",
"value": "23,48,108",
"points": 2,
"category": "Color",
"item": "문구 (한국전통공예박람회)/② 채우기 : 색상(RGB:28,61,98)"
"item": "문구 (천혜의비경철쭉)/② 채우기 : 색상(RGB:23,48,108)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "한국전통공예박람회",
"searchValue": "천혜의비경철쭉",
"value": "110",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (한국전통공예박람회)/③ 크기-너비 (110 mm)"
"item": "문구 (천혜의비경철쭉)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "한국전통공예박람회",
"searchValue": "천혜의비경철쭉",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (한국전통공예박람회)/④ 크기-높이 (20 mm)"
"item": "문구 (천혜의비경철쭉)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "한국전통공예박람회",
"searchValue": "천혜의비경철쭉",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (한국전통공예박람회)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (천혜의비경철쭉)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "한국전통공예박람회",
"searchValue": "천혜의비경철쭉",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (한국전통공예박람회)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (천혜의비경철쭉)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "한국전통공예박람회",
"searchValue": "천혜의비경철쭉",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (한국전통공예박람회)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (슬기로운국제사진공모전)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
@@ -117,18 +117,18 @@
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "전",
"value": "궁서체",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (궁서체)"
"item": "어/② 글씨체 (굴림)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "전",
"value": "236,217,74",
"value": "237,134,232",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:236,217,74)"
"item": "어/③ 면색 : 색상(RGB:237,134,232)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
@@ -141,19 +141,19 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 장인과 예술가들이 참여",
"searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 장인과 예술가들이 참여)/① BOLD"
"item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 장인과 예술가들이 참여",
"value": "UNDERLINE",
"searchValue": "바래봉 해발 약 500m에서 시작해 점점 정상으로",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 장인과 예술가들이 참여)/② UNDERLINE"
"item": "문구 (바래봉 해발 약 500m에서 시작해 점점 정상으로)/② ITALIC"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
@@ -169,37 +169,37 @@
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"searchValue": "참여안내",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (● 행사안내 ●)/① 글씨체 (궁서)"
"item": "문구 (● 참여안내 ●)/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"match_str": "참여안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (● 행사안내 ●)/② 정렬 (가운데 정렬)"
"item": "문구 (● 참여안내 ●)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "한국 전통공예 박람회 홈페이지 (http://www.ihd.or.kr)",
"searchValue": "홈페이지(http://www.ihd.or.kr) 참고",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (한국 전통공예 박람회 홈페이지 (http://www.ihd.or.kr))/① ITALIC"
"item": "문구 (홈페이지(http://www.ihd.or.kr) 참고)/① ITALIC"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "한국 전통공예 박람회 홈페이지 (http://www.ihd.or.kr)",
"searchValue": "홈페이지(http://www.ihd.or.kr) 참고",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (한국 전통공예 박람회 홈페이지 (http://www.ihd.or.kr))/② UNDERLINE"
"item": "문구 (홈페이지(http://www.ihd.or.kr) 참고)/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
@@ -215,52 +215,52 @@
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 03. 28.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/① 크기 (1400)",
"item": "문구 (2026. 03. 28.)/① 크기 (1400)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 03. 28.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 03. 28.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "한국 전통공예 협의회",
"value": "굴림",
"searchValue": "운봉바래봉철쭉제",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (한국 전통공예 협의회)/① 글씨체 (굴림)"
"item": "문구 (운봉바래봉철쭉제)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "한국 전통공예 협의회",
"searchValue": "운봉바래봉철쭉제",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국 전통공예 협의회)/② 크기 (2600)"
"item": "문구 (운봉바래봉철쭉제)/② 크기 (2600)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "한국 전통공예 협의회",
"searchValue": "운봉바래봉철쭉제",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국 전통공예 협의회)/③ 정렬 (가운데 정렬)"
"item": "문구 (운봉바래봉철쭉제)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "궁서",
"value": "중고딕",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (궁서)"
"item": "문구 (DIAT)/① 글꼴 (중고딕)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -283,7 +283,7 @@
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기",
"item": "① 쪽 번호 매기기 (I,II,III 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -311,7 +311,7 @@
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"item": "왼쪽 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
@@ -334,7 +334,7 @@
"first_word": "전",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 200% 설정",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "65",
"value": "50",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (한국 전통공예)/① 크기-너비 (65 mm)"
"item": "문구 (철쭉과 진달래)/① 크기-너비 (50 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (한국 전통공예)/② 크기-높이 (12 mm)"
"item": "문구 (철쭉과 진달래)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,51 +387,51 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (한국 전통공예)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (철쭉과 진달래)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (한국 전통공예)/④ 글상자 모서리 (반원)",
"item": "문구 (철쭉과 진달래)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "202,86,167",
"value": "247,226,144",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (한국 전통공예)/⑤ 채우기 : 색상(RGB:202,86,167)"
"item": "문구 (철쭉과 진달래)/⑤ 채우기 : 색상(RGB:247,226,144)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (한국 전통공예)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (철쭉과 진달래)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (한국 전통공예)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (철쭉과 진달래)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "견고딕",
"value": "굴림체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (한국 전통공예)/⑧ 글씨체 (견고딕)"
"item": "문구 (철쭉과 진달래)/⑧ 글씨체 (굴림체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"value": "1800",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (한국 전통공예)/⑨ 글씨크기 (2000)",
"item": "문구 (철쭉과 진달래)/⑨ 글씨크기 (1800)",
"desc": "1pt당 100"
},
"13": {
@@ -439,7 +439,7 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (한국 전통공예)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (철쭉과 진달래)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
@@ -472,88 +472,88 @@
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "24",
"value": "23",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 23 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 전통공예",
"value": "굴림체",
"searchValue": "1. 철쭉의 특징",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구① (1. 전통공예)/① 글씨체 (굴림체)"
"item": "문구① (1. 철쭉의 특징)/① 글씨체 (궁서)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 전통공예",
"searchValue": "1. 철쭉의 특징",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 전통공예)/② 크기 (1200)"
"item": "문구① (1. 철쭉의 특징)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 전통공예",
"searchValue": "1. 철쭉의 특징",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 전통공예)/③ 진하게"
"item": "문구① (1. 철쭉의 특징)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 전통 공예 산업",
"value": "굴림체",
"searchValue": "2. 봄의 전령 진달래",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구② (2. 전통 공예 산업)/① 글씨체 (굴림체)"
"item": "문구② (2. 봄의 전령 진달래)/① 글씨체 (궁서)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 전통 공예 산업",
"searchValue": "2. 봄의 전령 진달래",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 전통 공예 산업)/② 크기 (1200)"
"item": "문구② (2. 봄의 전령 진달래)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 전통 공예 산업",
"searchValue": "2. 봄의 전령 진달래",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 전통 공예 산업)/③ 진하게"
"item": "문구② (2. 사진 산업의 가치)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "업사이클링",
"option": "거름",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (업사이클링)/① 각주 설정 및 문구 입력"
"item": "문구 (거름)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "이미 쓸모없거나 버려지는 자원을 재활용해 새로운 가치를 부여하는 것을 의미함",
"value": "중고딕",
"searchValue": "땅을 기름지게 하기 위해 사용하는 유기물질",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (업사이클링)/② 글씨체 (중고딕)"
"item": "문구 (거름)/② 글씨체 (굴림)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "이미 쓸모없거나 버려지는 자원을 재활용해 새로운 가치를 부여하는 것을 의미함",
"searchValue": "땅을 기름지게 하기 위해 사용하는 유기물질",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (업사이클링)/③ 크기 (9pt)"
"item": "문구 (거름)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "이미 쓸모없거나 버려지는 자원을 재활용해 새로운 가치를 부여하는 것을 의미함",
"value": "CircledIdeograph",
"searchValue": "땅을 기름지게 하기 위해 사용하는 유기물질",
"value": "Ideograph",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
@@ -579,81 +579,81 @@
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Upcycling')])",
"ignoreWord": "Upcycling",
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Breeding",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Upcycling/영단어 미입력, 대소문자/오타 시 전체 감점",
"item": "Breeding/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["차원", "次元"],
["사례", "事例"],
["주목", "注目"],
["소비", "消費"],
["명장", "名匠"]
["생육", "生育"],
["유년", "幼年"],
["허기", "虛飢"],
["풍류", "風流"],
["식물", "植物"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 차원(次元), ② 사례(事例), ③ 주목(注目), ④ 소비(消費), ⑤ 명장(名匠)"
"item": "① 생육(生育), ② 유년(幼年), ③ 허기(虛飢), ④ 풍류(風流), ⑤ 식물(植物)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'국인관광')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'지를잘라')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (...활성화되면서 관광객과 외국인 일반...)>'관광객과 / 외국인' 순서바꿈"
"item": "문구 (…새로 나온 가지가 잘라…)>'가 → 를' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'예품등이')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'보다참꽃')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (...디지털 아트 공예품 통이...)>'통' → '등' 글자바꿈"
"item": "문구 (…참꽃나무란 진달래보다 이름에 더…)>'참꽃나무란 / 진달래보다' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"value": "돋움",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/① 글씨체 (돋움)"
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/① 글씨체 (돋움)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/② 크기 (1200)"
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/③ 진하게"
"item": "제목 문구 (철쭉 관광객 현황(단위 : 천 명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"searchValue": "철쭉 관광객 현황(단위 : 천 명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (연령별 축제 만족도(단위:%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "138,194,217",
"value": "160,221,234",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:138,194,217)"
"item": "위쪽 제목 셀/① 색상(RGB:160,221,234)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -704,8 +704,8 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "표식만 있는 분산형",
"chart_type": "누적 세로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (표식만 있는 분산형)",
"item": "① 종류 (누적 세로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"value": "굴림",
"searchValue": "철쭉 관광객 현황",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/① 글씨체 (굴림)"
"item": "제목 문구 (철쭉 관광객 현황)/① 글씨체 (휴먼옛체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"searchValue": "철쭉 관광객 현황",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/② 크기 (1300)"
"item": "제목 문구 (철쭉 관광객 현황)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "전통 공예 산업 성장률(단위: %)",
"searchValue": "철쭉 관광객 현황",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전통 공예 산업 성장률(단위: %))/③ 기울임",
"item": "제목 문구 (철쭉 관광객 현황)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)"
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)"
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)"
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

850
JSON/2604/DIW_2604A.json Normal file
View File

@@ -0,0 +1,850 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "디지털노마드창업자모집",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (디지털노마드창업자모집)/① 글씨체 (휴먼옛체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "디지털노마드창업자모집",
"value": "202,86,167",
"points": 2,
"category": "Color",
"item": "문구 (디지털노마드창업자모집)/② 채우기 : 색상(RGB:202,86,167)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "디지털노마드창업자모집",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털노마드창업자모집)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "디지털노마드창업자모집",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털노마드창업자모집)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "디지털노마드창업자모집",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털노마드창업자모집)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "디지털노마드창업자모집",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털노마드창업자모집)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "디지털노마드창업자모집",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (디지털노마드창업자모집)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "서",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "서",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (궁서체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "서",
"value": "238,219,98",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:238,219,98)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "서",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "디지털노마드 형태의 근무와 창업에 관심 있는 분들의",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "디지털노마드 형태의 근무와 창업에 관심 있는 분들의",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "◎",
"char2": "◎",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ◎ , ② ◎ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "참여안내",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (◎ 참여안내 ◎)/① 글씨체 (돋움)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "참여안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (◎ 참여안내 ◎)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서면심사 및 대면심사",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서면심사 및 대면심사)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서면심사 및 대면심사",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서면심사 및 대면심사)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 04. 25.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 25.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 04. 25.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 25.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "디지털노마드센터",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구 (디지털노마드센터)/① 글씨체 (굴림체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "디지털노마드센터",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (디지털노마드센터)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "디지털노마드센터",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (디지털노마드센터)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "HangulSyllable",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//CHAR[contains(text(),'{searchValue}')]",
"searchValue": "http",
"value": true,
"points": 2,
"category": "hyperlink",
"item": "문구 (http://www.ihd.or.kr)/하이퍼링크 없이 작성",
"desc": "searchValue에 해당하는 주소 문구에 하이퍼링크가 하나라도 설정되어 있으면 오답"
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"first_word": "서",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "60",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (디지털노마드)/① 크기-너비 (60 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (디지털노마드)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (디지털노마드)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (디지털노마드)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "192,205,239",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (디지털노마드)/⑤ 채우기 : 색상(RGB:192,205,239)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (디지털노마드)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (디지털노마드)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "견고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (디지털노마드)/⑧ 글씨체 (견고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "1900",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (디지털노마드)/⑨ 글씨크기 (1900)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (디지털노마드)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 디지털노마드란?",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구① (1. 디지털노마드란?)/① 글씨체 (돋움)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 디지털노마드란?",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 디지털노마드란?)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 디지털노마드란?",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 디지털노마드란?)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 디지털노마드의 장단점",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구② (2. 디지털노마드의 장단점)/① 글씨체 (돋움)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 디지털노마드의 장단점",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 디지털노마드의 장단점)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 디지털노마드의 장단점",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 디지털노마드의 장단점)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "공유오피스",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (공유오피스)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "함께 사용할 수 있는 사무공간",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구 (공유오피스)/② 글씨체 (돋움체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "함께 사용할 수 있는 사무공간",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (공유오피스)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "함께 사용할 수 있는 사무공간",
"value": "UserChar",
"points": 2,
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Digital",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Digital/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["원격", "遠隔"],
["환경", "環境"],
["문화", "文化"],
["형성", "形成"],
["부여", "附與"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 원격(遠隔), ② 환경(環境), ③ 문화(文化), ④ 형성(形成), ⑤ 부여(附與)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'소에구애')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…기기를 활용해 장소는 구애받지 않고…)>'는' → '에' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'무나원격')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…원격근무를 재택근무나 하는 사람들을 말한다.…)>'원격근무를 / 재택근무나' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "전 세계 디지털노마드 추이(단위:만명)",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (전 세계 디지털노마드 추이(단위:만명))/① 글씨체 (중고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "전 세계 디지털노마드 추이(단위:만명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전 세계 디지털노마드 추이(단위:만명))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "전 세계 디지털노마드 추이(단위:만명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (전 세계 디지털노마드 추이(단위:만명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "전 세계 디지털노마드 추이(단위:만명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전 세계 디지털노마드 추이(단위:만명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "175,232,239",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:175,232,239)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "바탕체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (바탕체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "곡선이 있는 분산형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (곡선이 있는 분산형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "전 세계 디지털노마드 추이",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전 세계 디지털노마드 추이)/① 글씨체 (궁서)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "전 세계 디지털노마드 추이",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전 세계 디지털노마드 추이)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "전 세계 디지털노마드 추이",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (전 세계 디지털노마드 추이)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (굴림체)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (굴림체)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "굴림체",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (굴림체)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

850
JSON/2604/DIW_2604B.json Normal file
View File

@@ -0,0 +1,850 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "세계문화체험페스티벌",
"value": "굴림",
"points": 1,
"category": "OneAnswer",
"item": "문구 (세계문화체험페스티벌)/① 글씨체 (굴림)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "세계문화체험페스티벌",
"value": "28,61,98",
"points": 2,
"category": "Color",
"item": "문구 (세계문화체험페스티벌)/② 채우기 : 색상(RGB:28,61,98)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "세계문화체험페스티벌",
"value": "130",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (세계문화체험페스티벌)/③ 크기-너비 (130 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "세계문화체험페스티벌",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (세계문화체험페스티벌)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "세계문화체험페스티벌",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (세계문화체험페스티벌)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "세계문화체험페스티벌",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (세계문화체험페스티벌)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "세계문화체험페스티벌",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (세계문화체험페스티벌)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "전",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "전",
"value": "맑은 고딕",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (맑은 고딕)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "전",
"value": "245,132,58",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:245,132,58)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "전",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "전통 공연, 의상 체험, 음식 시식, 공예 체험",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "전통 공연, 의상 체험, 음식 시식, 공예 체험",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② ITALIC"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "▶",
"char2": "◀",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ▶ , ② ◀ , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 (▶ 행사안내 ◀)/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (▶ 행사안내 ◀)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026년 5월 1일(금) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026년 5월 1일(금) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2026년 5월 1일(금) 18:00까지 온라인으로 등록(http://www.ihd.or.kr)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2026년 5월 1일(금) 18:00까지 온라인으로 등록(http://www.ihd.or.kr))/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 04. 25.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 25.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 04. 25.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 25.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "세계도시문화축제협회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (세계도시문화축제협회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "세계도시문화축제협회",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (세계도시문화축제협회)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "세계도시문화축제협회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국대학교육협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "중고딕",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (중고딕)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "RomanSmall",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "오른쪽 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//CHAR[contains(text(),'{searchValue}')]",
"searchValue": "http",
"value": true,
"points": 2,
"category": "hyperlink",
"item": "문구 (http://www.ihd.or.kr)/하이퍼링크 없이 작성",
"desc": "searchValue에 해당하는 주소 문구에 하이퍼링크가 하나라도 설정되어 있으면 오답"
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "180",
"first_word": "전",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "65",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (글로벌 문화 교류)/① 크기-너비 (65 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (글로벌 문화 교류)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (글로벌 문화 교류)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (글로벌 문화 교류)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "199,231,245",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (글로벌 문화 교류)/⑤ 채우기 : 색상(RGB:199,231,245)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (글로벌 문화 교류)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (글로벌 문화 교류)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "궁서",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (글로벌 문화 교류)/⑧ 글씨체 (궁서)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (글로벌 문화 교류)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (글로벌 문화 교류)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림B.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 글로벌 문화 트렌드",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구① (1. 글로벌 문화 트렌드)/① 글씨체 (굴림)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 글로벌 문화 트렌드",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 글로벌 문화 트렌드)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 글로벌 문화 트렌드",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 글로벌 문화 트렌드)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 문화 산업의 가치",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구② (2. 문화 산업의 가치)/① 글씨체 (굴림)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 문화 산업의 가치",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 문화 산업의 가치)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 문화 산업의 가치",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 문화 산업의 가치)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "브랜드",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (브랜드)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "경제적인 생산자를 구별하는 지각된 이미지와 경험의 집합으로 상품이나 회사를 나타내는 상표임",
"value": "바탕체",
"points": 1,
"category": "FontName",
"item": "문구 (브랜드)/② 글씨체 (바탕체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "경제적인 생산자를 구별하는 지각된 이미지와 경험의 집합으로 상품이나 회사를 나타내는 상표임",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (브랜드)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "경제적인 생산자를 구별하는 지각된 이미지와 경험의 집합으로 상품이나 회사를 나타내는 상표임",
"value": "DecagonCircleHanja",
"points": 2,
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Pandemic",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Pandemic/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["문화", "文化"],
["인기", "人氣"],
["초월", "超越"],
["미식", "美食"],
["정부", "政府"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 문화(文化), ② 인기(人氣), ③ 초월(超越), ④ 미식(美食), ⑤ 정부(政府)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'전시,문화')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…온라인 문화 전시, 가상 체험, 디지털 공연 등이…)>'문화 / 전시,' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'화를현대')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…전통문화는 현대적으로…)>'는 → 를' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/① 글씨체 (돋움)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,62,98",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,62,98)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "표식만 있는 분산형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (표식만 있는 분산형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "굴림체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/① 글씨체 (굴림체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "문화 산업 시장 성장률(단위:%)",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (문화 산업 시장 성장률(단위:%))/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -46,65 +46,65 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "재활용의 날 행사",
"value": "맑은고딕",
"searchValue": "인상파예술특별기획전",
"value": "휴먼명조",
"points": 1,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/① 글씨체 (맑은고딕)"
"item": "문구 (인상파예술특별기획전)/① 글씨체 (휴먼명조)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "재활용의 날 행사",
"value": "49,95,151",
"searchValue": "인상파예술특별기획전",
"value": "95,172,34",
"points": 2,
"category": "Color",
"item": "문구 (재활용의 날 행사)/② 채우기 : 색상(RGB:49,95,151)"
"item": "문구 (인상파예술특별기획전)/② 채우기 : 색상(RGB:95,172,34)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "재활용의 날 행사",
"value": "100",
"searchValue": "인상파예술특별기획전",
"value": "130",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (재활용의 날 행사)/③ 크기-너비 (100 mm)"
"item": "문구 (인상파예술특별기획전)/③ 크기-너비 (130 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "재활용의 날 행사",
"searchValue": "인상파예술특별기획전",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (재활용의 날 행사)/④ 크기-높이 (20 mm)"
"item": "문구 (인상파예술특별기획전)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "재활용의 날 행사",
"searchValue": "인상파예술특별기획전",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (인상파예술특별기획전)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "재활용의 날 행사",
"searchValue": "인상파예술특별기획전",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (인상파예술특별기획전)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "재활용의 날 행사",
"searchValue": "인상파예술특별기획전",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (재활용의 날 행사)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (대학교육정책포럼)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,23 +116,23 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"value": "돋움체",
"searchValue": "",
"value": "맑은 고딕",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (돋움체)"
"item": "어/② 글씨체 (맑은 고딕)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "210,154,216",
"searchValue": "",
"value": "244,82,29",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:210,154,216)"
"item": "어/③ 면색 : 색상(RGB:244,82,29)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,126 +141,126 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정",
"value": "BOLD",
"searchValue": "인상파 미술에 대한 깊이 있는 이해를 도와드립니다.",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정)/① BOLD"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① ITALIC"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정",
"searchValue": "인상파 미술에 대한 깊이 있는 이해를 도와드립니다.",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정)/② UNDERLINE"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "",
"char2": "",
"char1": "",
"char2": "",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① , ② , ③ ※"
"item": "① , ② , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"searchValue": "전시정보",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (▣ 행사안내 ▣)/① 글씨체 (돋움)"
"item": "문구 (◉ 전시정보 ◉)/① 글씨체 (돋움)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"match_str": "전시정보",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (▣ 행사안내 ▣)/② 정렬 (가운데 정렬)"
"item": "문구 (◉ 전시정보 ◉)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "부산시청 앞 광장, 부산시 쓰레기 매립장 등",
"searchValue": "나만의 키링 만들기 체험",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (부산시청 앞 광장, 부산시 쓰레기 매립장 등)/① BOLD"
"item": "문구 (나만의 키링 만들기 체험)/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "부산시청 앞 광장, 부산시 쓰레기 매립장 등",
"searchValue": "나만의 키링 만들기 체험",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (부산시청 앞 광장, 부산시 쓰레기 매립장 등)/② ITALIC"
"item": "문구 (나만의 키링 만들기 체험)/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 12,
"Left": 15,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (12), 내어쓰기 (12)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (15), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 1. 21.",
"value": "1200",
"searchValue": "2026. 04. 25.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 1. 21.)/① 크기 (1200)",
"item": "문구 (2026. 04. 25.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 1. 21.",
"searchValue": "2026. 04. 25.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 1. 21.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 04. 25.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "한국환경보전단체",
"value": "궁서",
"searchValue": "성남오아시스예술센터",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구 (한국환경보전단체)/① 글씨체 (궁서)"
"item": "문구 (성남오아시스예술센터)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "한국환경보전단체",
"value": "2400",
"searchValue": "성남오아시스예술센터",
"value": "2600",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국환경보전단체)/② 크기 (2400)"
"item": "문구 (성남오아시스예술센터)/② 크기 (2600)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "한국환경보전단체",
"searchValue": "성남오아시스예술센터",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국환경보전단체)/③ 정렬 (가운데 정렬)"
"item": "문구 (성남오아시스예술센터)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "돋움",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -308,10 +308,10 @@
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"value": "BottomRight",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"item": "오른쪽 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
@@ -330,11 +330,11 @@
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"first_word": "",
"value": "200",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
"item": "문제 1 줄간격 200% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -370,14 +370,14 @@
"value": "50",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (재활용 방법)/① 크기-너비 (50 mm)"
"item": "문구 (인상주의)/① 크기-너비 (50 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (재활용 방법)/② 크기-높이 (12 mm)"
"item": "문구 (인상주의)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,51 +387,51 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (재활용 방법)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (인상주의)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "20",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (재활용 방법)/④ 글상자 모서리 (둥근모양)",
"item": "문구 (인상주의)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "227,220,193",
"value": "245,177,248",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (재활용 방법)/⑤ 채우기 : 색상(RGB:227,220,193)"
"item": "문구 (인상주의)/⑤ 채우기 : 색상(RGB:245,177,248)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (재활용 방법)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (인상주의)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (재활용 방법)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (인상주의)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "굴림체",
"value": "견고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (재활용 방법)/⑧ 글씨체 (굴림체)"
"item": "문구 (인상주의)/⑧ 글씨체 (견고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "1800",
"value": "2200",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (재활용 방법)/⑨ 글씨크기 (1800)",
"item": "문구 (인상주의)/⑨ 글씨크기 (2200)",
"desc": "1pt당 100"
},
"13": {
@@ -439,22 +439,22 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (재활용 방법)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (인상주의)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"item": "① 파일명 \"그림C.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (80 mm)"
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
@@ -479,83 +479,83 @@
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 재활용이란?",
"searchValue": "1. 인상주의란?",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 재활용이란?)/① 글씨체 (돋움체)"
"item": "문구① (1. 인상주의란?)/① 글씨체 (중고딕)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 재활용이란?",
"searchValue": "1. 인상주의란?",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 재활용이란?)/② 크기 (1200)"
"item": "문구① (1. 인상주의란?)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 재활용이란?",
"searchValue": "1. 인상주의란?",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 재활용이란?)/③ 진하게"
"item": "문구① (1. 인상주의란?)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 식재료 재활용 방법",
"searchValue": "2. 인상파 화가",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 식재료 재활용 방법)/① 글씨체 (돋움체)"
"item": "문구② (2. 인상파 화가)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 식재료 재활용 방법",
"searchValue": "2. 인상파 화가",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 식재료 재활용 방법)/② 크기 (1200)"
"item": "문구② (2. 인상파 화가)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 식재료 재활용 방법",
"searchValue": "2. 인상파 화가",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 식재료 재활용 방법)/③ 진하게"
"item": "문구② (2. 인상파 화가)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "얼룩",
"option": "연작",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (얼룩)/① 각주 설정 및 문구 입력"
"item": "문구 (연작)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"value": "돋움체",
"searchValue": "변화 포착을 위해 같은 풍경을 반복적으로 그림",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구 (얼룩)/② 글씨체 (돋움체)"
"item": "문구 (연작)/② 글씨체 (굴림체)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"searchValue": "변화 포착을 위해 같은 풍경을 반복적으로 그림",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (얼룩)/③ 크기 (9pt)"
"item": "문구 (연작)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"value": "LatinSmall",
"searchValue": "변화 포착을 위해 같은 풍경을 반복적으로 그림",
"value": "CircledIdeograph",
"points": 2,
"category": "OneAnswer",
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
@@ -580,80 +580,80 @@
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Refrigerator",
"ignoreWord": "Expression",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Refrigerator/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
"item": "Expression/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["적자", "赤字"],
["가치", "價値"],
["제거", "除去"],
["청소", "淸掃"],
["광택", "光澤"]
["규범", "規範"],
["관찰", "觀察"],
["화가", "畫家"],
["탐구", "探究"],
["여성", "女性"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 적자(赤字), 가치(價値), 제거(除去), ④ 청소(淸掃), ⑤ 광택(光澤)"
"item": "① 규범(規範), ② 관찰(觀察), ③ 화가(畫家), ④ 탐구(探究), ⑤ 여성(女性)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'용은주로')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'화를가져')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…재활용이 주로 정치적…)>'이'→'은' 글자바꿈"
"item": "문구 (…큰 변화를 갖져왔다.…)>'갖' → '가' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'량만재활')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'료로활용')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (상징적으로 재활용 소량만 하는 경우도)>'활용 / 소량만' 순서바꿈"
"item": "문구 (…문화 상품과 교육 활용되며 자료로 대중문화에도…)>'활용되며 / 자료로' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "재활용 주민 참여율(%)",
"value": "궁서",
"searchValue": "인상파 작품 소장 현황",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (재활용 주민 참여율(%))/① 글씨체 (궁서)"
"item": "제목 문구 (인상파 작품 소장 현황)/① 글씨체 (돋움체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "인상파 작품 소장 현황",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율(%))/② 크기 (1200)"
"item": "제목 문구 (인상파 작품 소장 현황)/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "인상파 작품 소장 현황",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (재활용 주민 참여율(%))/③ 진하게"
"item": "제목 문구 (인상파 작품 소장 현황)/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "인상파 작품 소장 현황",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율(%))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (인상파 작품 소장 현황(단위: 천 명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "33,174,201",
"value": "84,207,228",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:33,174,201)"
"item": "위쪽 제목 셀/① 색상(RGB:84,207,228)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -682,11 +682,11 @@
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"value": "중고딕",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"item": "글자모양/① 글씨체 (중고딕)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
@@ -704,8 +704,8 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "SUM",
"value": true,
"points": 4,
"category": "Boolean",
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "표식만 있는 분산형",
"chart_type": "100% 기준 누적 세로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (표식만 있는 분산형)",
"item": "① 종류 (100% 기준 누적 세로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "도시별 재활용 참여율",
"value": "돋움",
"searchValue": "인상파 작품 소장 현황",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (도시별 재활용 참여율)/① 글씨체 (돋움)"
"item": "제목 문구 (인상파 작품 소장 현황)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "도시별 재활용 참여율",
"value": "1300",
"searchValue": "인상파 작품 소장 현황",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (도시별 재활용 참여율)/② 크기 (1300)"
"item": "제목 문구 (인상파 작품 소장 현황)/② 크기 (1200)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "도시별 재활용 참여율",
"searchValue": "인상파 작품 소장 현황",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (도시별 재활용 참여율)/③ 기울임",
"item": "제목 문구 (인상파 작품 소장 현황)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (바탕)"
"item": "X축/① 글꼴 (궁서)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (바탕)"
"item": "Y축/① 글꼴 (궁서)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (바탕)"
"item": "범례/① 글꼴 (궁서)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

View File

@@ -0,0 +1,840 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "견고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (소셜네트워킹전략컨퍼런스)/① 글씨체 (견고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "201,102,248",
"points": 2,
"category": "Color",
"item": "문구 (소셜네트워킹전략컨퍼런스)/② 채우기 : 색상(RGB:201,102,248)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (소셜네트워킹전략컨퍼런스)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (소셜네트워킹전략컨퍼런스)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (소셜네트워킹전략컨퍼런스)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (소셜네트워킹전략컨퍼런스)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "소셜네트워킹전략컨퍼런스",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (소셜네트워킹전략컨퍼런스)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "최",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "최",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (궁서)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "최",
"value": "218,202,48",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:218,202,48)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "최",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "소셜 네트워킹 서비스",
"value": "BOLD",
"points": 2,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "소셜 네트워킹 서비스",
"value": "ITALIC",
"points": 2,
"category": "FontAttribute",
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② ITALIC"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "□",
"char2": "□",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① □, ② □, ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (□ 행사안내 □)/① 글씨체 (굴림)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (□ 행사안내 □)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울 강남구 한국정보기술협력센터 3층 대회의장",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서울 강남구 한국정보기술협력센터 3층 대회의장)/① ITALIC"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "서울 강남구 한국정보기술협력센터 3층 대회의장",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (서울 강남구 한국정보기술협력센터 3층 대회의장)/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 04. 07.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 07.)/① 크기 (1400)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 04. 07.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 04. 07.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "한국정보서비스학회장",
"value": "궁서체",
"points": 1,
"category": "FontName",
"item": "문구 (한국정보서비스학회장)/① 글씨체 (궁서체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "한국정보서비스학회장",
"value": "2000",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국정보서비스학회장)/② 크기 (2000)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "한국정보서비스학회장",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국정보서비스학회장)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "돋움",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "Digit",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "180",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 180% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점)"
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "70",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (소셜 네트워킹 서비스)/① 크기-너비 (70 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (소셜 네트워킹 서비스)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (소셜 네트워킹 서비스)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (소셜 네트워킹 서비스)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "90,233,53",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (소셜 네트워킹 서비스)/⑤ 채우기 : 색상(RGB:90,233,53)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (소셜 네트워킹 서비스)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (소셜 네트워킹 서비스)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "궁서체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (소셜 네트워킹 서비스)/⑧ 글씨체 (궁서체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "1800",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (소셜 네트워킹 서비스)/⑨ 글씨크기 (1800)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (소셜 네트워킹 서비스)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "45",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (45 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 소셜 네트워킹 서비스",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구① (1. 소셜 네트워킹 서비스)/① 글씨체 (굴림체)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 소셜 네트워킹 서비스",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 소셜 네트워킹 서비스)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 소셜 네트워킹 서비스",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 소셜 네트워킹 서비스)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 소셜 네트워킹 서비스 활용",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "문구② (2. 소셜 네트워킹 서비스 활용)/① 글씨체 (굴림체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 소셜 네트워킹 서비스 활용",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 소셜 네트워킹 서비스 활용)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 소셜 네트워킹 서비스 활용",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 소셜 네트워킹 서비스 활용)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "마이크로블로깅",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (마이크로블로깅)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "블로거가 한두 문장 정도의 단편적 정보를 관심이 있는 개인들에게 전달하는 통신방식",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (마이크로블로깅)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "블로거가 한두 문장 정도의 단편적 정보를 관심이 있는 개인들에게 전달하는 통신방식",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (마이크로블로깅)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "블로거가 한두 문장 정도의 단편적 정보를 관심이 있는 개인들에게 전달하는 통신방식",
"value": "CircledIdeograph",
"points": 2,
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Marketing",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Marketing/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["방식", "方式"],
["관계", "關係"],
["획득", "獲得"],
["정보", "情報"],
["절감", "節減"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 방식(方式), ② 관계(關係), ③ 획득(獲得), ④ 정보(情報), ⑤ 절감(節減)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'적인매체')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…대표적의 매체로…)>'의' → '인' 글자바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'인이필요')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…필요한 개인이 정보를…)>'필요한' / '개인이' 순서바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "스마트폰 가입자 수(단위 : 만 명)",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (스마트폰 가입자 수(단위 : 만 명))/① 글씨체 (중고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "스마트폰 가입자 수(단위 : 만 명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (스마트폰 가입자 수(단위 : 만 명))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "스마트폰 가입자 수(단위 : 만 명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (스마트폰 가입자 수(단위 : 만 명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "스마트폰 가입자 수(단위 : 만 명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (스마트폰 가입자 수(단위 : 만 명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "248,203,169",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:248,203,169)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "꺾은선형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (꺾은선형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "스마트폰 가입자 수",
"value": "궁서체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (스마트폰 가입자 수)/① 글씨체 (궁서체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "스마트폰 가입자 수",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (스마트폰 가입자 수)/② 크기 (1200)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "스마트폰 가입자 수",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (스마트폰 가입자 수)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "돋움체",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움체)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "돋움체",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움체)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "돋움체",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움체)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

View File

@@ -46,61 +46,61 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "재활용의 날 행사",
"value": "맑은고딕",
"searchValue": "대학교육정책포럼",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/① 글씨체 (맑은고딕)"
"item": "문구 (대학교육정책포럼)/① 글씨체 (휴먼옛체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "재활용의 날 행사",
"value": "49,95,151",
"searchValue": "대학교육정책포럼",
"value": "53,135,145",
"points": 2,
"category": "Color",
"item": "문구 (재활용의 날 행사)/② 채우기 : 색상(RGB:49,95,151)"
"item": "문구 (대학교육정책포럼)/② 채우기 : 색상(RGB:53,135,145)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "재활용의 날 행사",
"value": "100",
"searchValue": "대학교육정책포럼",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (재활용의 날 행사)/③ 크기-너비 (100 mm)"
"item": "문구 (대학교육정책포럼)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "재활용의 날 행사",
"searchValue": "대학교육정책포럼",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (재활용의 날 행사)/④ 크기-높이 (20 mm)"
"item": "문구 (대학교육정책포럼)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "재활용의 날 행사",
"searchValue": "대학교육정책포럼",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (대학교육정책포럼)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "재활용의 날 행사",
"searchValue": "대학교육정책포럼",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (재활용의 날 행사)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (대학교육정책포럼)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "재활용의 날 행사",
"searchValue": "대학교육정책포럼",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (재활용의 날 행사)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (대학교육정책포럼)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
@@ -117,18 +117,18 @@
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "한",
"value": "돋움체",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (돋움체)"
"item": "어/② 글씨체 (굴림체)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "한",
"value": "210,154,216",
"value": "192,204,239",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:210,154,216)"
"item": "어/③ 면색 : 색상(RGB:192,204,239)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
@@ -141,39 +141,39 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정",
"searchValue": "대학 퇴출 및 통폐합의 방향과 과제를 주제",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정)/① BOLD"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정",
"searchValue": "대학 퇴출 및 통폐합의 방향과 과제를 주제",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (자원재활용이 이루어지는 과정을 담은 영상물 관람과 시설 견학이 있을 예정)/② UNDERLINE"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "",
"char2": "",
"char1": "",
"char2": "",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① , ② , ③ ※"
"item": "① , ② , ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "돋움",
"value": "궁서",
"points": 1,
"category": "FontName",
"item": "문구 ( 행사안내 )/① 글씨체 (돋움)"
"item": "문구 ( 행사안내 )/① 글씨체 (궁서)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
@@ -181,86 +181,86 @@
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
"item": "문구 ( 행사안내 )/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "부산시청 앞 광장, 부산시 쓰레기 매립장 등",
"searchValue": "2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (부산시청 앞 광장, 부산시 쓰레기 매립장 등)/① BOLD"
"item": "문구 (2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr))/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "부산시청 앞 광장, 부산시 쓰레기 매립장 등",
"searchValue": "2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (부산시청 앞 광장, 부산시 쓰레기 매립장 등)/② ITALIC"
"item": "문구 (2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr))/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 12,
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (12), 내어쓰기 (12)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2026. 1. 21.",
"value": "1200",
"searchValue": "2026. 04. 22.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 1. 21.)/① 크기 (1200)",
"item": "문구 (2026. 04. 22.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2026. 1. 21.",
"searchValue": "2026. 04. 22.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2026. 1. 21.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 04. 22.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "한국환경보전단체",
"value": "궁서",
"searchValue": "한국대학교육협의회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (한국환경보전단체)/① 글씨체 (궁서)"
"item": "문구 (한국대학교육협의회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "한국환경보전단체",
"value": "2400",
"searchValue": "한국대학교육협의회",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국환경보전단체)/② 크기 (2400)"
"item": "문구 (한국대학교육협의회)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "한국환경보전단체",
"searchValue": "한국대학교육협의회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (한국환경보전단체)/③ 정렬 (가운데 정렬)"
"item": "문구 (한국대학교육협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "돋움",
"value": "굴림",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (돋움)"
"item": "문구 (DIAT)/① 글꼴 (굴림)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
@@ -280,7 +280,7 @@
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "HangulSyllable",
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
@@ -330,11 +330,11 @@
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"value": "200",
"first_word": "한",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
"item": "문제 1 줄간격 200% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "50",
"value": "65",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (재활용 방법)/① 크기-너비 (50 mm)"
"item": "문구 (대학 구조조정)/① 크기-너비 (65 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (재활용 방법)/② 크기-높이 (12 mm)"
"item": "문구 (대학 구조조정)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,7 +387,7 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (재활용 방법)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (대학 구조조정)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
@@ -395,7 +395,7 @@
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (재활용 방법)/④ 글상자 모서리 (둥근모양)",
"item": "문구 (대학 구조조정)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
@@ -403,35 +403,35 @@
"value": "227,220,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (재활용 방법)/⑤ 채우기 : 색상(RGB:227,220,193)"
"item": "문구 (대학 구조조정)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (재활용 방법)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (대학 구조조정)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (재활용 방법)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (대학 구조조정)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "굴림체",
"value": "궁서체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (재활용 방법)/⑧ 글씨체 (굴림체)"
"item": "문구 (대학 구조조정)/⑧ 글씨체 (궁서체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "1800",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (재활용 방법)/⑨ 글씨크기 (1800)",
"item": "문구 (대학 구조조정)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,7 +439,7 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (재활용 방법)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (대학 구조조정)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
@@ -458,10 +458,10 @@
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"value": "35",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
"item": "③ 크기-높이 (35 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
@@ -472,90 +472,90 @@
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 재활용이란?",
"value": "돋움체",
"searchValue": "1. 학령인구 감소",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구① (1. 재활용이란?)/① 글씨체 (돋움체)"
"item": "문구① (1. 학령인구 감소)/① 글씨체 (중고딕)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 재활용이란?",
"searchValue": "1. 학령인구 감소",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 재활용이란?)/② 크기 (1200)"
"item": "문구① (1. 학령인구 감소)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 재활용이란?",
"searchValue": "1. 학령인구 감소",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 재활용이란?)/③ 진하게"
"item": "문구① (1. 학령인구 감소)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 식재료 재활용 방법",
"value": "돋움체",
"searchValue": "2. 한계대학이란?",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구② (2. 식재료 재활용 방법)/① 글씨체 (돋움체)"
"item": "문구② (2. 한계대학이란?)/① 글씨체 (중고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 식재료 재활용 방법",
"searchValue": "2. 한계대학이란?",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 식재료 재활용 방법)/② 크기 (1200)"
"item": "문구② (2. 한계대학이란?)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 식재료 재활용 방법",
"searchValue": "2. 한계대학이란?",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 식재료 재활용 방법)/③ 진하게"
"item": "문구② (2. 한계대학이란?)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "얼룩",
"option": "학령인구",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (얼룩)/① 각주 설정 및 문구 입력"
"item": "문구 (학령인구)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (얼룩)/② 글씨체 (돋움)"
"item": "문구 (학령인구)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (얼룩)/③ 크기 (9pt)"
"item": "문구 (학령인구)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "본바탕에 다른 빛깔의 점이나 줄 따위가 뚜렷하게 섞인 자국",
"value": "LatinSmall",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "DecagonCircleHanja",
"points": 2,
"category": "OneAnswer",
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
@@ -580,80 +580,80 @@
},
"29": {
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Refrigerator",
"ignoreWord": "Management",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Refrigerator/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
"item": "Management/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["적자", "赤字"],
["가치", "價値"],
["제거", "除去"],
["청소", "淸掃"],
["광택", "光澤"]
["환경", "環境"],
["분석", "分析"],
["재무구조", "財務構造"],
["경영", "經營"],
["상태", "狀態"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 적자(赤字), 가치(價値), 제거(除去), ④ 청소(淸掃), ⑤ 광택(光澤)"
"item": "① 환경(環境), ② 분석(分析), ③ 재무구조(財務構造), ④ 경영(經營), ⑤ 상태(狀態)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'용은주로')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'덕적해이')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…재활용이 주로 정치적…)>'이'→'은' 글자바꿈"
"item": "문구 (…비위나 해이가 도덕적 대학…)>'해이가 / 도덕적' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'량만재활')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'증가추이')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (상징적으로 재활용 소량만 하는 경우도)>'재활용 / 소량만' 순서바꿈"
"item": "문구 (…향후 증강 추이는 가속화될 전망이다…)>'강 → 가' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "재활용 주민 참여율(%)",
"value": "궁서",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "맑은고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (재활용 주민 참여율(%))/① 글씨체 (궁서)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/① 글씨체 (맑은고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율(%))/② 크기 (1200)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (재활용 주민 참여율(%))/③ 진하게"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "재활용 주민 참여율(%)",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율(%))/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "33,174,201",
"value": "158,219,98",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:33,174,201)"
"item": "위쪽 제목 셀/① 색상(RGB:158,219,98)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -682,11 +682,11 @@
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"value": "돋움체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"item": "글자모양/① 글씨체 (돋움체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
@@ -704,7 +704,7 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "묶은 가로 막대형",
"chart_type": "꺾은선형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은 가로 막대형)",
"item": "① 종류 (꺾은선형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -738,10 +738,10 @@
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (80 mm)"
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "재활용 주민 참여율",
"value": "돋움",
"searchValue": "학령인구 변동 추계",
"value": "굴림체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율)/① 글씨체 (돋움)"
"item": "제목 문구 (학령인구 변동 추계)/① 글씨체 (굴림체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "재활용 주민 참여율",
"searchValue": "학령인구 변동 추계",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율)/② 크기 (1300)"
"item": "제목 문구 (학령인구 변동 추계)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "재활용 주민 참여율",
"searchValue": "학령인구 변동 추계",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (재활용 주민 참여율)/③ 기울임",
"item": "제목 문구 (학령인구 변동 추계)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (바탕)"
"item": "X축/① 글꼴 (궁서)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (바탕)"
"item": "Y축/① 글꼴 (궁서)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "바탕",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (바탕)"
"item": "범례/① 글꼴 (궁서)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

View File

@@ -46,65 +46,65 @@
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "생성형 인공지능 세미나 안내",
"value": "궁서체",
"searchValue": "대학교육정책포럼",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "문구 (생성형 인공지능 세미나 안내)/① 글씨체 (궁서체)"
"item": "문구 (대학교육정책포럼)/① 글씨체 (휴먼옛체)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "생성형 인공지능 세미나 안내",
"value": "233,190,46",
"searchValue": "대학교육정책포럼",
"value": "53,135,145",
"points": 2,
"category": "Color",
"item": "문구 (생성형 인공지능 세미나 안내)/② 채우기 : 색상(RGB:233,190,46)"
"item": "문구 (대학교육정책포럼)/② 채우기 : 색상(RGB:53,135,145)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "생성형 인공지능 세미나 안내",
"value": "110",
"searchValue": "대학교육정책포럼",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (생성형 인공지능 세미나 안내)/③ 크기-너비 (110 mm)"
"item": "문구 (대학교육정책포럼)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "생성형 인공지능 세미나 안내",
"searchValue": "대학교육정책포럼",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (생성형 인공지능 세미나 안내)/④ 크기-높이 (20 mm)"
"item": "문구 (대학교육정책포럼)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "생성형 인공지능 세미나 안내",
"searchValue": "대학교육정책포럼",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (생성형 인공지능 세미나 안내)/⑤ 위치 (글자처럼 취급)"
"item": "문구 (대학교육정책포럼)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "생성형 인공지능 세미나 안내",
"searchValue": "대학교육정책포럼",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (생성형 인공지능 세미나 안내)/⑥ 정렬 (가운데 정렬)"
"item": "문구 (대학교육정책포럼)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "생성형 인공지능 세미나 안내",
"searchValue": "대학교육정책포럼",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (생성형 인공지능 세미나 안내)/⑦ 글맵시모양 (육안확인)"
"item": "문구 (대학교육정책포럼)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "",
"searchValue": "",
"value": {
"Height": 2800,
"Width": 2800
@@ -116,7 +116,7 @@
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "",
"searchValue": "",
"value": "굴림체",
"points": 1,
"category": "FontName",
@@ -124,15 +124,15 @@
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "",
"value": "221,251,229",
"searchValue": "",
"value": "192,204,239",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:221,251,229)"
"item": "어/③ 면색 : 색상(RGB:192,204,239)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "",
"searchValue": "",
"value": "3.0",
"tolerance": 1,
"points": 2,
@@ -141,19 +141,19 @@
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "생성형 인공지능",
"searchValue": "대학 퇴출 및 통폐합의 방향과 과제를 주제",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (생성형 인공지능)/① BOLD"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "생성형 인공지능",
"value": "ITALIC",
"searchValue": "대학 퇴출 및 통폐합의 방향과 과제를 주제",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (생성형 인공지능)/② ITALIC"
"item": "문구 (평생교육사 양성 교육과정 현황과 개선 방안 탐색)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
@@ -186,73 +186,73 @@
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "협회 홈페이지(https://www.ihd.or.kr)",
"searchValue": "2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (협회 홈페이지(https://www.ihd.or.kr))/① BOLD"
"item": "문구 (2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr))/① BOLD"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "협회 홈페이지(https://www.ihd.or.kr)",
"value": "UNDERLINE",
"searchValue": "2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (협회 홈페이지(https://www.ihd.or.kr))/② UNDERLINE"
"item": "문구 (2026. 05. 01.(금) 18:00까지 온라인 사전 등록(http://www.ihd.or.kr))/② ITALIC"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 13,
"Indent": 10
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (13), 내어쓰기 (10)",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 04. 22.",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/① 크기 (1300)",
"item": "문구 (2026. 04. 22.)/① 크기 (1300)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 12. 20.",
"searchValue": "2026. 04. 22.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/② 정렬 (가운데 정렬)"
"item": "문구 (2026. 04. 22.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "생성형인공지능협회",
"value": "돋움",
"searchValue": "한국대학교육협의회",
"value": "견고딕",
"points": 1,
"category": "FontName",
"item": "문구 (생성형인공지능협회)/① 글씨체 (돋움)"
"item": "문구 (한국대학교육협의회)/① 글씨체 (견고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "생성형인공지능협회",
"value": "2000",
"searchValue": "한국대학교육협의회",
"value": "2500",
"points": 1,
"category": "OneAnswer",
"item": "문구 (생성형인공지능협회)/② 크기 (2000)"
"item": "문구 (한국대학교육협의회)/② 크기 (2500)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "생성형인공지능협회",
"searchValue": "한국대학교육협의회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (생성형인공지능협회)/③ 정렬 (가운데 정렬)"
"item": "문구 (한국대학교육협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
@@ -283,7 +283,7 @@
"value": "LatinCapital",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
@@ -308,10 +308,10 @@
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomRight",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "왼쪽 아래",
"item": "가운데 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
@@ -331,7 +331,7 @@
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "200",
"first_word": "",
"first_word": "",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 200% 설정",
@@ -367,17 +367,17 @@
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "60",
"value": "65",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (생성형 인공지능)/① 크기-너비 (60 mm)"
"item": "문구 (대학 구조조정)/① 크기-너비 (65 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (생성형 인공지능)/② 크기-높이 (12 mm)"
"item": "문구 (대학 구조조정)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
@@ -387,51 +387,51 @@
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (생성형 인공지능)/③ 테두리 : 이중 실선(1.00mm)",
"item": "문구 (대학 구조조정)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "0",
"value": "20",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (생성형 인공지능)/④ 글상자 모서리 (직각)",
"desc": "모서리 비율 반원:50 / 둥근모양:20 / 직각:0"
"item": "문구 (대학 구조조정)/④ 글상자 모서리 (둥근모양)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "153,226,253",
"value": "227,220,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (생성형 인공지능)/⑤ 채우기 : 색상(RGB:153,226,253)"
"item": "문구 (대학 구조조정)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (생성형 인공지능)/⑥ 글상자 위치 (글자처럼 취급)"
"item": "문구 (대학 구조조정)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (생성형 인공지능)/⑦ 글상자 정렬 (가운데 정렬)"
"item": "문구 (대학 구조조정)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "견고딕",
"value": "궁서체",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (생성형 인공지능)/⑧ 글씨체 (견고딕)"
"item": "문구 (대학 구조조정)/⑧ 글씨체 (궁서체)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (생성형 인공지능)/⑨ 글씨크기 (2000)",
"item": "문구 (대학 구조조정)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
@@ -439,29 +439,29 @@
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (생성형 인공지능)/⑩ 정렬 (가운데 정렬)"
"item": "문구 (대학 구조조정)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림D.jpg\" 삽입",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
"item": "② 크기-너비 (80 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"value": "35",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
"item": "③ 크기-높이 (35 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
@@ -472,90 +472,90 @@
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "22",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 22 mm)"
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 서비스 현황",
"value": "돋움체",
"searchValue": "1. 학령인구 감소",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구① (1. 서비스 현황)/① 글씨체 (돋움체)"
"item": "문구① (1. 학령인구 감소)/① 글씨체 (중고딕)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 서비스 현황",
"searchValue": "1. 학령인구 감소",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 서비스 현황)/② 크기 (1200)"
"item": "문구① (1. 학령인구 감소)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 서비스 현황",
"searchValue": "1. 학령인구 감소",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 서비스 현황)/③ 진하게"
"item": "문구① (1. 학령인구 감소)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 활용 분야",
"value": "돋움체",
"searchValue": "2. 한계대학이란?",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구② (2. 활용 분야)/① 글씨체 (돋움체)"
"item": "문구② (2. 한계대학이란?)/① 글씨체 (중고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 활용 분야",
"searchValue": "2. 한계대학이란?",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 활용 분야)/② 크기 (1200)"
"item": "문구② (2. 한계대학이란?)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 활용 분야",
"searchValue": "2. 한계대학이란?",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 활용 분야)/③ 진하게"
"item": "문구② (2. 한계대학이란?)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "핀테크",
"option": "학령인구",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (핀테크)/① 각주 설정 및 문구 입력"
"item": "문구 (학령인구)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "금융 서비스의 효율성과 접근성을 혁신하는 신산업",
"value": "굴림",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (핀테크)/② 글씨체 (굴림)"
"item": "문구 (학령인구)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "금융 서비스의 효율성과 접근성을 혁신하는 신산업",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (핀테크)/③ 크기 (9pt)"
"item": "문구 (학령인구)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "금융 서비스의 효율성과 접근성을 혁신하는 신산업",
"value": "CircledLatinCapital",
"searchValue": "유치원 : 만 3~5세, 초등학교 : 만 6~11세, 중학교 : 만 12~14세, 고등학교 : 만 15~17세",
"value": "DecagonCircleHanja",
"points": 2,
"category": "OneAnswer",
"category": "PageNumber",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
@@ -579,81 +579,81 @@
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Generative')])",
"ignoreWord": "Generative",
"path": "boolean(//CHAR[contains(text(),'{ignoreWord}')])",
"ignoreWord": "Management",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Generative/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
"item": "Management/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": ""
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["생성", "生成"],
["현재", "現在"],
["조", "造"],
["결함", "缺陷"],
["극대", "極大"]
["환경", "環境"],
["분석", "分析"],
["재무구조", "財務構造"],
["경영", "經營"],
["상태", "狀態"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 생성(生成), ② 현재(現在), ③ 창조(創造), ④ 결함(缺陷), ⑤ 극대(極大)"
"item": "① 환경(環境), ② 분석(分析), ③ 재무구조(財務構造), ④ 경영(經營), ⑤ 상태(狀態)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'성형인공')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'덕적해이')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…사용하는 인공지능 생성형 서비스이다…)>'인공지능 / 생성형' 순서바꿈"
"item": "문구 (…비위나 해이가 도덕적 대학…)>'해이가 / 도덕적' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'률검토를')])",
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'증가추이')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…작성 및 법률 검투를 수행…)>'투''토' 글자바꿈"
"item": "문구 (…향후 증강 추이는 가속화될 전망이다…)>'' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "생성형 인공지능 서비스 이용률 현황",
"value": "굴림체",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "맑은고딕",
"points": 1,
"category": "FontName",
"item": "제목 문구 (생성형 인공지능 서비스 이용률 현황)/① 글씨체 (굴림체)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/① 글씨체 (맑은고딕)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "생성형 인공지능 서비스 이용률 현황",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (생성형 인공지능 서비스 이용률 현황)/② 크기 (1200)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/② 크기 (1200)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "생성형 인공지능 서비스 이용률 현황",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (생성형 인공지능 서비스 이용률 현황)/③ 진하게"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "생성형 인공지능 서비스 이용률 현황",
"searchValue": "학령인구 변동 추계(단위: 천 명)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (생성형 인공지능 서비스 이용률 현황)/④ 정렬 (가운데 정렬)"
"item": "제목 문구 (학령인구 변동 추계(단위: 천 명))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "232,250,210",
"value": "158,219,98",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:232,250,210)"
"item": "위쪽 제목 셀/① 색상(RGB:158,219,98)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
@@ -682,11 +682,11 @@
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "중고딕",
"value": "돋움체",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (중고딕)",
"item": "글자모양/① 글씨체 (돋움체)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
@@ -704,7 +704,7 @@
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) or boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
@@ -714,11 +714,11 @@
},
"45": {
"chart_xpath": "",
"chart_type": "묶은 가로 막대형",
"chart_type": "꺾은선형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은 가로 막대형)",
"item": "① 종류 (꺾은선형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
@@ -738,10 +738,10 @@
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "80",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (80 mm)"
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
@@ -753,36 +753,36 @@
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "생성형 인공지능 이용률 현황",
"value": "휴먼옛체",
"searchValue": "학령인구 변동 추계",
"value": "굴림체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (생성형 인공지능 이용률 현황)/① 글씨체 (휴먼옛체)"
"item": "제목 문구 (학령인구 변동 추계)/① 글씨체 (굴림체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "생성형 인공지능 이용률 현황",
"searchValue": "학령인구 변동 추계",
"value": "1300",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (생성형 인공지능 이용률 현황)/② 크기 (1300)"
"item": "제목 문구 (학령인구 변동 추계)/② 크기 (1300)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "생성형 인공지능 이용률 현황",
"searchValue": "학령인구 변동 추계",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (생성형 인공지능 이용률 현황)/③ 기울임",
"item": "제목 문구 (학령인구 변동 추계)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (돋움)"
"item": "X축/① 글꼴 (궁서)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
@@ -801,11 +801,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (돋움)"
"item": "Y축/① 글꼴 (궁서)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
@@ -824,11 +824,11 @@
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "돋움",
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (돋움)"
"item": "범례/① 글꼴 (궁서)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",

View File

@@ -1,52 +0,0 @@
import os
import shutil
import unicodedata
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 dir_name in dirs:
if dir_name.lower() == 'diw': # DIW 디렉토리 탐색
parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name)))
target_root = None
parent_dir = unicodedata.normalize('NFC', parent_dir)
# 부모 디렉토리가 '2교시'인지, '3교시'인지 확인
if parent_dir == '1교시':
target_root = target_root_a
elif parent_dir == '2교시':
target_root = target_root_b
elif parent_dir == '3교시':
target_root = target_root_c
elif parent_dir == '4교시':
target_root = target_root_d
elif parent_dir == '5교시':
target_root = target_root_e
if target_root:
source_dic_path = os.path.join(root, dir_name)
target_dir_name = dir_name.upper()
target_dic_path = os.path.join(target_root, target_dir_name)
# DIC 하위 디렉토리와 파일 복사
shutil.copytree(source_dic_path, target_dic_path, dirs_exist_ok=True)
print(f"Copied {source_dic_path} to {target_dic_path}")
test_folder_path = os.path.join(target_root, "TEST")
os.makedirs(test_folder_path, exist_ok=True)
else:
print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.")
# 사용법
# exam_round = "2504_2"
exam_round = "2509"
source_directory = r"D:\project\HWP\HWP-Scoring\회차별채점자료\2509"
target_directory_a = f".\\input\\{exam_round}\\A" # '1교시'의 타겟 경로
target_directory_b = f".\\input\\{exam_round}\\B" # '2교시'의 타겟 경로
target_directory_c = f".\\input\\{exam_round}\\C" # '3교시'의 타겟 경로
target_directory_d = f".\\input\\{exam_round}\\D" # '4교시'의 타겟 경로
target_directory_e = f".\\input\\{exam_round}\\E" # '5교시'의 타겟 경로
copy_dic_subdirs(source_directory, target_directory_a, target_directory_b, target_directory_c, target_directory_d, target_directory_e)

View File

@@ -1,43 +0,0 @@
import base64
import re
from lxml import etree as ET
xml_path = r"C:\Users\dra\project\HWP-Scoring\output\워드(한글)-009866-성유나.hml"
tree = ET.parse(xml_path)
root = tree.getroot()
# xpath로 바이너리 부분추출
binary_data = root.xpath('//BINDATA[@Id=//BINITEM[@Format="OLE"]/@BinData]/text()')
binary_data = binary_data[0].encode('utf-8')
# 파일을 읽어들입니다.
# with open('./chartBinData2', 'rb') as file:
# encoded_data = file.read()
# encoded_data 내에 존재하는 <BINDATA ...> ... </BINDATA> 태그를 찾아서 삭제
# <BINDATA ...> 태그는 base64 디코딩을 수행할 때 오류가 발생하므로 삭제합니다.
# <BINDATA ...> 태그와 그 내부 내용을 삭제합니다.
encoded_data = re.sub(b'<BINDATA.*?>', b'', binary_data)
# encoded_data = re.sub(b'<BINDATA.*?>', b'', encoded_data)
# print(encoded_data)
encoded_data = encoded_data.replace(b'</BINDATA>', b'')
encoded_data = encoded_data.replace(b'\r\n', b'')
# print(encoded_data+b'==')
# base64 디코딩을 수행합니다.
decoded_data = base64.b64decode(encoded_data+b'==')
print(decoded_data)
# 디코딩된 데이터 내용 중 xml 형식만 추출할 때 <c:chartSpace>, </c:chartSpace> 사이의 데이터만 추출.
start = decoded_data.find(b'<?xml')
print(start)
end = decoded_data.find(b'</c:chartSpace>')
print(end)
xml_data = decoded_data[start:end+len(b'</c:chartSpace>')]
# 디코딩된 데이터를 파일로 저장합니다.
with open('ext_BinData.xml', 'wb') as file:
file.write(xml_data)
print("Decoding complete. Decoded data saved to 'decoded_chartBinData'.")

View File

@@ -1 +1 @@
[{"kind":1,"language":"markdown","value":"# XPath Notebook\nDate: 2025-01-22     Time: 16:12:58"},{"kind":1,"language":"markdown","value":"* mm > pt 변환비율 = 2.83465 \r\n* 283.465"},{"kind":1,"language":"markdown","value":"- 색상 demical 코드 [1-2] [1-10] [2-8] [2-37]"},{"kind":2,"language":"xpath","value":"//TEXTART[@Text='클라우드컴퓨팅컨퍼런스']/descendant::WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//RECTANGLE[.//CHAR[text()='전']]//WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//RECTANGLE//CHAR[text()='클라우드 컴퓨팅']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor"},{"kind":1,"language":"markdown","value":"- [1-10] ① ●, ② ●, ③ ※"},{"kind":2,"language":"xpath","value":"\"path\": \"count(//CHAR[contains(text(),'●')]) + count(//CHAR[contains(text(),'※')])\",\r\n \"path2\": \"string-length(//CHAR[contains(text(),'●')]) - string-length(translate(//CHAR[contains(text(),'●')], '●', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))\","},{"kind":1,"language":"markdown","value":"- [1-28] [2-28] @FormatType 종류\r\n - HangulSyllable : 가나다\r\n - Digit : 123\r\n - DecagonCircle : 갑을병정\r\n - LatinCapital : ABC\r\n - CircledDigit : ①,②,③\r\n - Ideograph : 一,二,三\r\n - CircledHangulJamo : ㉠,㉡,㉢\r\n - CircledLatinSmall : ⓐ,ⓑ,ⓒ\r\n - RomanSmall : i,ii,iii"},{"kind":2,"language":"xpath","value":"//SECTION[1]//PAGENUM/@FormatType"},{"kind":2,"language":"xpath","value":"//P[TEXT[CHAR[contains(text(), '눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함')]]]//AUTONUMFORMAT/@Type"},{"kind":1,"language":"markdown","value":"- [2-30] ① 저감(低減), ② 화석(化石), ③ 투자(投資), ④ 달성(達成), ⑤ 세금(稅金)"},{"kind":2,"language":"xpath","value":"(count(//CHAR[contains(text(),'저감')][contains(text(),'低減')])+count(//CHAR[contains(text(),'화석')][contains(text(),'化石')])+count(//CHAR[contains(text(),'투자')][contains(text(),'投資')])+count(//CHAR[contains(text(),'달성')][contains(text(),'達成')])+count(//CHAR[contains(text(),'세금')][contains(text(),'稅金')]))*2"},{"kind":1,"language":"markdown","value":"- [2-37] [2-39] [2-40] @EndColAddr 속성값 \r\n - 표의 열 갯수-1\r\n - 4개=3 / 3개=2 / 2개=1"},{"kind":2,"language":"xpath","value":"@EndColAddr='2'"},{"kind":1,"language":"markdown","value":"- [2-45]\r\n - 꺾은선형 //c:lineChart[c:grouping[@val='standard']]\r\n - 묶은가로막대형 //c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']]\r\n - 묶은세로막대형 //c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']]\r\n - 원형 //c:pieChart\r\n - 분산형 //c:scatterChart"},{"kind":1,"language":"markdown","value":"//c:{chart_type}Chart/"},{"kind":2,"language":"xpath","value":"boolean(//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']])"},{"kind":2,"language":"xpath","value":"//c:valAx/c:majorTickMark/@val"},{"kind":2,"language":"xpath","value":"boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])"},{"kind":2,"language":"xpath","value":"//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '=AVG')]"},{"kind":2,"language":"xpath","value":"//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '=AVG')]"}]
[{"kind":1,"language":"markdown","value":"# XPath Notebook\nDate: 2025-01-22     Time: 16:12:58"},{"kind":2,"language":"xpath","value":""},{"kind":1,"language":"markdown","value":"* mm > pt 변환비율 = 2.83465 \r\n* 283.465"},{"kind":1,"language":"markdown","value":"- 색상 demical 코드 [1-2] [1-10] [2-8] [2-37]"},{"kind":2,"language":"xpath","value":"//TEXTART[@Text='클라우드컴퓨팅컨퍼런스']/descendant::WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//RECTANGLE[.//CHAR[text()='전']]//WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//RECTANGLE//CHAR[text()='클라우드 컴퓨팅']/ancestor::RECTANGLE/descendant::WINDOWBRUSH/@FaceColor"},{"kind":2,"language":"xpath","value":"//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor"},{"kind":1,"language":"markdown","value":"- [1-10] ① ●, ② ●, ③ ※"},{"kind":2,"language":"xpath","value":"\"path\": \"count(//CHAR[contains(text(),'●')]) + count(//CHAR[contains(text(),'※')])\",\r\n \"path2\": \"string-length(//CHAR[contains(text(),'●')]) - string-length(translate(//CHAR[contains(text(),'●')], '●', '')) + string-length(//CHAR[contains(text(),'※')]) - string-length(translate(//CHAR[contains(text(),'※')], '※', ''))\","},{"kind":1,"language":"markdown","value":"- [1-28] [2-28] @FormatType 종류\r\n - HangulSyllable : 가나다\r\n - Digit : 123\r\n - DecagonCircle : 갑을병정\r\n - LatinCapital : ABC\r\n - CircledDigit : ①,②,③\r\n - Ideograph : 一,二,三\r\n - CircledHangulJamo : ㉠,㉡,㉢\r\n - CircledLatinSmall : ⓐ,ⓑ,ⓒ\r\n - RomanSmall : i,ii,iii"},{"kind":2,"language":"xpath","value":"//SECTION[1]//PAGENUM/@FormatType"},{"kind":2,"language":"xpath","value":"//P[TEXT[CHAR[contains(text(), '눈으로 읽는 대신 귀로 들을 수 있게 책의 내용(문자)을 음성으로 녹음하여 기록한 것을 의미함')]]]//AUTONUMFORMAT/@Type"},{"kind":1,"language":"markdown","value":"- [2-30] ① 저감(低減), ② 화석(化石), ③ 투자(投資), ④ 달성(達成), ⑤ 세금(稅金)"},{"kind":2,"language":"xpath","value":"(count(//CHAR[contains(text(),'저감')][contains(text(),'低減')])+count(//CHAR[contains(text(),'화석')][contains(text(),'化石')])+count(//CHAR[contains(text(),'투자')][contains(text(),'投資')])+count(//CHAR[contains(text(),'달성')][contains(text(),'達成')])+count(//CHAR[contains(text(),'세금')][contains(text(),'稅金')]))*2"},{"kind":1,"language":"markdown","value":"- [2-37] [2-39] [2-40] @EndColAddr 속성값 \r\n - 표의 열 갯수-1\r\n - 4개=3 / 3개=2 / 2개=1"},{"kind":2,"language":"xpath","value":"@EndColAddr='2'"},{"kind":1,"language":"markdown","value":"- [2-45]\r\n - 꺾은선형 //c:lineChart[c:grouping[@val='standard']]\r\n - 묶은가로막대형 //c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']]\r\n - 묶은세로막대형 //c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']]\r\n - 원형 //c:pieChart\r\n - 분산형 //c:scatterChart"},{"kind":1,"language":"markdown","value":"//c:{chart_type}Chart/"},{"kind":2,"language":"xpath","value":"boolean(//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']])"},{"kind":2,"language":"xpath","value":"//c:valAx/c:majorTickMark/@val"},{"kind":2,"language":"xpath","value":"boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])"},{"kind":2,"language":"xpath","value":"//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '=AVG')]"},{"kind":2,"language":"xpath","value":"//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '=AVG')]"}]

BIN
diff.xlsx

Binary file not shown.

View File

@@ -1,659 +0,0 @@
import tkinter as tk
from tkinter import filedialog, messagebox
from datetime import datetime
import difflib
import json
from pathlib import Path
import os
from lxml import etree as ET
import re
from difflib import SequenceMatcher
import pandas as pd
import base64
# from xpathSearch import XMLPathHandler
class XMLScorer:
# 채점 기준 경로 초기화
def __init__(self, scoring_criteria_path):
# 채점 기준 로드
self.scoring_criteria = self._load_scoring_criteria(scoring_criteria_path)
def set_typo_score(self, score):
self.typo_score = score
def get_typo_score(self):
return self.typo_score
# 채점 기준파일 로드(JSON 파일)
def _load_scoring_criteria(self, file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return json.load(f)
# XML 파일에서 element의 값을 찾아 반환
def query_xml(self, root, *args):
first_xpath = args[0]
second_xpath = args[1]
points = args[2]
category = args[3]
right_answer = args[4]
if "Hyperlink" in category:
is_hyperlink = self.scoring_criteria["1"]["17"]["hyperlink"]
hyperlink_xpath = self.scoring_criteria["1"]["17"]["hyperlink_xpath"]
right_text = self.scoring_criteria["1"]["17"]["searchValue"].replace(" ","")
try:
# 하이퍼링크가 포함된 p태그 인지 확인
p_elements = root.xpath(is_hyperlink)
for p in p_elements:
text_list = p.xpath(".//CHAR/text()")
full_text = ''.join(text_list).replace(" ", "")
# right_text의 첫 문자
first_char = right_text[0]
# full_text에서 첫 문자 위치 찾기
index = full_text.find(first_char)
if index != -1:
trimmed_full_text = full_text[index:]
else:
trimmed_full_text = full_text # 일치 문자 없으면 원본 그대로
similarity = difflib.SequenceMatcher(None, trimmed_full_text, right_text).ratio()
# 두 문자열이 같을 경우만 하이퍼링크 확인
if similarity >= 0.7:
inside_field = False
charshape_values = []
for elem in p.iter():
# 시작 지점 확인
if elem.tag == "FIELDBEGIN":
inside_field = True
elif elem.tag == "FIELDEND":
inside_field = False
elif inside_field and elem.tag == "TEXT":
charshape = elem.get("CharShape")
if charshape:
charshape_values.append(charshape)
# 하이퍼링크에 해당하는 P태그 내 존재하는 charshape ID값 모두를 비교해 해당 속성(ITALIC, BOLD, UNDERLINE) 확인
if charshape_values:
for charshape in charshape_values:
result = root.xpath(hyperlink_xpath.replace('{charshape_id}', charshape))
# 해당 속성이 하나라도 적용되어있지 않으면 False 반환
if not result:
return result
return True
else:
return False
except ET.XPathEvalError as e:
return None
if ("특수문자" in category) and (second_xpath is not None):
try:
result = root.xpath(first_xpath)
# 결과값이 리스트형인데 내부에 정보가 없는경우
# 결과값이 없음
if type(result) is list and len(result) == 0:
return None
elif result < points:
result2 = root.xpath(second_xpath)
return max(result, result2)
else:
return result
except ET.XPathEvalError as e:
return None
# xpath2가 있는 경우
elif second_xpath is not None:
try:
result1 = root.xpath(first_xpath)
result2 = root.xpath(second_xpath)
if (type(result1) is list and len(result1) == 0) and (type(result2) is list and len(result2) == 0):
return None
# xpath1과 xpath2의 결과값이 모두 리스트인 경우
# 두 결과값 중 정답이 포함된 리스트를 반환
if type(result1) is list and type(result2) is list:
if right_answer in result1:
return result1
elif right_answer in result2:
return result2
return result1 if result1 else result2
except ET.XPathEvalError as e:
return None
else:
try:
result = root.xpath(first_xpath)
if type(result) is list and len(result) == 0:
return None
return result
except ET.XPathEvalError as e:
return None
def chart_query_xml(self, tree, xpath, namespaces):
result = tree.xpath(xpath, namespaces=namespaces)
if type(result) is list and len(result) == 0:
return None
return result
# 유사한 텍스트 찾기
def find_similar_text(self, root, target_text, threshold=0.7):
"""
전체 문서에서 유사한 텍스트를 찾아 반환
Args:
root (_type_): xml root element 객체
target_text (_type_): 찾을 텍스트
threshold (float, optional): 유사도 설정 Defaults to 0.3.
Returns:
str: 유사도 기준을 만족하는 텍스트
"""
# 전체 텍스트 추출
# all_text = root.xpath(f"//CHAR/text()")
# all_text.append(root.xpath(f"//TEXTART/@text"))
namespaces = {
'a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart'
}
if type(root) is str:
all_text = root
else:
all_text = root.xpath(f"//BODY//text() | //TEXTART/@Text | //c:chart//text()", namespaces=namespaces)
# 유사도 비교
max_score = 0
similar_text = ''
for text in all_text:
score = SequenceMatcher(None, target_text, text).ratio()
if score > max_score:
max_score = score
similar_text = text
if max_score >= threshold:
return similar_text
else:
return None
# 하나의 XML 파일 채점
def _score_xml_file(self, xml_file, chart_xml):
try:
tree = ET.parse(xml_file)
root = tree.getroot()
# 네임스페이스 정의
namespaces = {
'a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart'
}
# 차트 XML 파일이 없는 경우 0점 채점을 위헤 빈 XML 생성
if chart_xml is None:
chart_tree = ET.fromstring('<xml></xml>')
else:
chart_tree = ET.fromstring(chart_xml)
# 결과값을 Dictionary로 저장
results = {
'filename': os.path.basename(xml_file),
'score_results': [],
'total_score': 0,
'partial_scores': []
}
print(f"File name: {results['filename']}")
total_score = 0
for section_id, section in self.scoring_criteria.items():
partial_score = 0
for criterion_id, criterion in section.items():
id = criterion_id
xpath = criterion['path'] if 'path' in criterion else None
xpath2 = criterion['path2'] if 'path2' in criterion else None
search_value = criterion['searchValue'] if 'searchValue' in criterion else None
right_answer = criterion['value'] if 'value' in criterion else None
points = criterion['points'] if 'points' in criterion else None
category = criterion['category'] if 'category' in criterion else None
item = criterion['item']
similar_text = None
# chart xml 파일에서 채점하는 경우
if "chart_xml" in category:
if search_value is not None:
similar_text = self.find_similar_text(chart_tree, search_value)
if similar_text is None:
xpath = xpath.replace('{searchValue}', search_value)
else:
xpath = xpath.replace('{searchValue}', similar_text)
result = self.chart_query_xml(chart_tree, xpath, namespaces)
# 그 외의 hml 파일에서 채점하는 경우
else:
if search_value is not None:
similar_text = self.find_similar_text(root, search_value)
if similar_text is None:
xpath = xpath.replace('{searchValue}', search_value)
else:
xpath = xpath.replace('{searchValue}', similar_text)
result = self.query_xml(root, xpath, xpath2, points, category, right_answer)
# [ boolean 타입 ]
# 1. 이텔릭체, 굵게, 밑줄 등 효과가 적용 여부에 따라
# [ITALIC] [BOLD] [UNDERLINE] 태그가 있거나 없을 수 있으므로
# 존재 유무에 따라 True, False로 판단
# 2. 두 가지 이상의 조건을 모두 만족해야 하는 경우 and 연산자로 연결되어
# 반환값 True/False로 판단
# [ float 타입 ]
# 1. 부분점수의 합산으로 반환되는 경우 float 타입으로 반환
if type(result) is not list:
if type(result) is float and (result > points):
actual_answer = float(points)
else:
actual_answer = result
else:
if type(right_answer) is int:
actual_answer = int(result[0])
else:
actual_answer = result[0]
if "오타감점" in category:
points = self.get_typo_score()
scoring = {
'section': section_id,
'id': id,
'category': category, # 채점 분류
'item': item, # 채점 항목
'right_answer': right_answer, # 정답
'actual_answer': actual_answer, # 실제 작성 답안
'points': points,
'deductions': [] # 각 기준별 감점 내역
}
# 점수 차감 조건
# 1. 정답이 실수형으로 반환받은 경우는 채점항목의 부분점수 합산 결과이므로
# 반환받은 값 그대로를 점수로 사용
# 2. 정답이 정수형(사이즈 비교)의 경우 오차범위를 넘는다면 감점
# 3. 그 외의 경우 정답과 실제 작성 답안이 다른 경우 점수 차감
if type(actual_answer) is float:
scoring['points'] = actual_answer
elif type(actual_answer) is int:
# 오차범위 3 이상이면 감점
if abs(actual_answer - right_answer) > 3:
scoring['points'] -= points
else:
# right_answer(JSON파일 내 valuer값) null일 경우 점수감점 없이 진행
if right_answer != actual_answer:
scoring['points'] -= points
results['score_results'].append(scoring)
total_score += scoring['points']
partial_score += scoring['points']
print(f'scoring: {scoring}')
results['partial_scores'].append({
'section': section_id,
'score': partial_score
})
results['total_score'] = total_score
return results
except ET.ParseError as e:
return {
'filename': os.path.basename(xml_file),
'error': f"XML 파싱 오류: {str(e)}",
'total_score': 0
}
def binary_to_chartxml(self, xml_path):
tree = ET.parse(xml_path)
root = tree.getroot()
binary_data = root.xpath('//BINDATA[@Id=//BINITEM[@Format="OLE"]/@BinData]/text()')
if not binary_data:
return None
binary_data = binary_data[0].encode('utf-8')
# <BINDATA ...> 태그와 그 내부 내용을 삭제합니다.
encoded_data = re.sub(b'<BINDATA.*?>', b'', binary_data)
encoded_data = encoded_data.replace(b'</BINDATA>', b'')
encoded_data = encoded_data.replace(b'\r\n', b'')
# base64 디코딩을 수행합니다.
decoded_data = base64.b64decode(encoded_data+b'==')
# 디코딩된 데이터 내용 중 xml 형식만 추출할 때 <c:chartSpace>, </c:chartSpace> 사이의 데이터만 추출.
start = decoded_data.find(b'<?xml')
print(start)
end = decoded_data.find(b'</c:chartSpace>')
print(end)
xml_data = decoded_data[start:end+len(b'</c:chartSpace>')]
# xml 데이터가 없는 경우 None을 반환합니다.
if -1 in [start, end]:
return None
# 디코딩된 데이터를 파일로 저장합니다.
base_filename = os.path.splitext(xml_path)[0]
new_filename = f'{base_filename}.xml'
with open(new_filename, 'wb') as file:
file.write(xml_data)
return xml_data
def typo_check(self, correct_answer_file, user_answer_file, chart_xml):
user_answer_tree = ET.parse(user_answer_file)
user_answer_root = user_answer_tree.getroot()
correct_answer_tree = ET.parse(correct_answer_file)
correct_answer_root = correct_answer_tree.getroot()
# xpath로 바이너리 부분추출
user_input_text = user_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
user_table_text = user_answer_root.xpath('//TABLE//CHAR//text()')
user_input_text += user_table_text
correct_input_text = correct_answer_root.xpath('//CHAR//text()[not(ancestor::HEADER) and not(ancestor::TABLE)]')
correct_table_text = correct_answer_root.xpath('//TABLE//CHAR//text()')
correct_input_text += correct_table_text
# 차트 XML에서 제목 추출
if chart_xml is not None:
chart_xml_tree = ET.fromstring(chart_xml)
# 차트 제목 추출
user_chart_title = chart_xml_tree.xpath('/c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t', namespaces={'c': 'http://schemas.openxmlformats.org/drawingml/2006/chart', 'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'})
# 차트 제목이 존재하는 경우
if user_chart_title:
user_input_text.append(user_chart_title[0].text)
# 차트 제목 정답 텍스트 추출
correct_chart_title = self.scoring_criteria["2"]["50"]["searchValue"]
correct_input_text.append(correct_chart_title)
# 각 요소에서 공백 제거
user_input_text = [text.replace(' ', '') for text in user_input_text]
correct_input_text = [text.replace(' ', '') for text in correct_input_text]
# 숫자와 특정 형식 제거 (예: 1., 2., 3., -)
user_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in user_input_text]
correct_input_text = [re.sub(r'\d+\.\s*|-', '', text) for text in correct_input_text]
try :
# xpath = self.scoring_criteria["2"]["29"]['path'].split("'")[1]
# ignore_word = xpath.split("'")[1]
ignore_word = self.scoring_criteria["2"]["29"]["ignoreWord"]
# 특정 단어 제거
# 오타와 누락의 경우만 판단하면 정상작동하지만
# 추가 된 단어의 경우를 채점기준에 추가하면 정확하게 채점 되지 않을 수 있음
# [정답] Hybrid [실제작성]
user_input_text = [text.replace(ignore_word, '') for text in user_input_text]
correct_input_text = [text.replace(ignore_word, '') for text in correct_input_text]
except (KeyError, IndexError, AttributeError):
ignore_word = None
print(f"ignore_word: {ignore_word}")
# 리스트를 하나의 문자열로 변경
user_input_text_str = ''.join(user_input_text)
currect_input_text_str = ''.join(correct_input_text)
print("user_input_text as string:")
print(user_input_text_str)
print("\ncurrect_input_text_answer as string:")
print(currect_input_text_str)
# 문자열의 차이를 비교
diff = difflib.ndiff(currect_input_text_str, user_input_text_str)
diff_list = list(diff)
# 차이점을 정리하여 result_diff에 저장
result_diff = []
# 누락 된 단어만 따로 리스트로 저장
missing_list = []
# 오타와 누락된 단어 리스트 저장
error_missing_list = []
skip_next = False
for i, line in enumerate(diff_list):
if skip_next:
skip_next = False
continue
# diff_list의 line 시작이 '-'이면서 다음 line이 '+'이면 두 line을 붙여서 맞춤법이 틀린 단어로 판단
if line.startswith('- '):
# 오타
if i + 1 < len(diff_list) and diff_list[i + 1].startswith('+ '):
line = line.replace('- ', '-')
next = diff_list[i + 1].replace('+ ', '')
result_diff.append(line+'=>'+next)
error_missing_list.append(line+'=>'+next)
skip_next = True
# 누락
else:
line = line.replace('- ', '-')
result_diff.append(line)
missing_list.append(line)
error_missing_list.append(line)
# 없어도 되는 글자가 있는 경우 (추가)
elif line.startswith('+ '):
line = line.replace('+ ', '+')
result_diff.append(line)
# result_diff 출력
# print("\nResult Differences:")
# for diff in result_diff:
# print(diff)
# result_diff 배열의 길이를 맨 앞에 저장
# 모든 차이를 계산해 점수 차감
# temp = 40 - min(len(result_diff)*2, 40)
# 누락된 텍스트만 계산해 점수 차감
# temp = 40 - min(len(missing_list)*2, 40)
# 2503회 기준 오타 1개당 [2점]->[1점] 차감
temp = 40 - min(len(error_missing_list)*1, 40)
self.set_typo_score(temp)
result_diff.insert(0, temp)
return result_diff
# XML 파일 채점
def score_directory(self, xml_directory, correct_answer_file):
# xml 파일 불러오기
xml_files = Path(xml_directory).glob('*.hml')
# 결과 저장할 리스트
results = []
for user_answer_file in xml_files:
result = {}
chart_xml = self.binary_to_chartxml(user_answer_file)
result['typo'] = self.typo_check(correct_answer_file, user_answer_file, chart_xml)
result['score'] = self._score_xml_file(user_answer_file, chart_xml)
# result['score']['score_results'][2]['points'] = result['typo'][0]
results.append(result)
return results
def parse_filename(self, filename):
if isinstance(filename, dict):
filename = filename.get('파일명', '')
match = re.match(r'.*-(\d+)-(.+)\.hml', filename)
if match:
number = match.group(1)
name = match.group(2)
return number, name
return None, None
def export_to_excel(self, results, output_path=None):
if output_path is None:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") #연월일_시분초
# timestamp = datetime.now().strftime("%Y%m%d") #연월일
output_path = f"scoring_results_{timestamp}.xlsx"
summary_data = []
detail_data = []
typo_data = []
for temp in results:
# 요약 정보
result = temp['score']
summary_row = {
'파일명': result['filename'],
'총점': result.get('total_score', 0)
}
if 'error' in result:
summary_row['오류'] = result['error']
summary_data.append(summary_row)
# 상세 정보
if 'score_results' in result:
filename = {'파일명': result['filename']}
number, name = self.parse_filename(filename)
if (number or name) is None:
detail_row = {'채점항목': result['filename'] }
else:
detail_row = {'채점항목':f"{number}-{name}"}
section_num = None
row_index = []
for i, score_result in enumerate(result['score_results']):
current_section = score_result['section']
if section_num is None:
section_num = current_section
# 다음 섹션(문제0 => 문제1)로 넘어갔을 경우 or 마지막 문제일 경우
if current_section != section_num:
# 이전 섹션의 부분합을 출력
detail_row[f'문제{section_num}'] = result['partial_scores'][int(section_num)]['score']
row_index.append(f'문제{section_num}')
section_num = current_section
detail_row[f'{i+1}'] = score_result['points']
row_index.append(score_result['id'])
# 마지막 섹션(문제2)부분합 점수를 출력
if i == len(result['score_results']) - 1:
detail_row[f'문제{current_section}'] = result['partial_scores'][int(current_section)]['score']
row_index.append(f'문제{current_section}')
detail_row['총점'] = result.get('total_score', 0)
row_index.append('총점')
detail_data.append(detail_row)
summary_df = pd.DataFrame(summary_data)
detail_df = pd.DataFrame(detail_data).transpose()
detail_df.columns = detail_df.iloc[0]
detail_df = detail_df[1:]
detail_df.index = row_index
# detail_df = pd.DataFrame(detail_data)
for temp in results:
result = temp['typo']
typo_data.append(result)
typo_df = pd.DataFrame(typo_data).transpose()
# detail_df = pd.DataFrame(detail_data)
# ExcelWriter 객체 생성
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
summary_df.to_excel(writer, sheet_name='채점결과요약', index=False)
detail_df.to_excel(writer, sheet_name='채점상세내역', index=True)
typo_df.to_excel(writer, sheet_name='오타내역', index=False)
# 열 너비 자동 조정
# for sheet_name in writer.sheets:
# worksheet = writer.sheets[sheet_name]
# for column_cells in worksheet.columns:
# max_length = 0
# column = column_cells[0].column_letter # 열의 문자
# for cell in column_cells:
# try:
# if cell.value:
# max_length = max(max_length, len(str(cell.value)))
# except:
# pass
# adjusted_width = (max_length + 2)
# worksheet.column_dimensions[column].width = adjusted_width
return output_path
def main():
# 시험회차 및 유형
exam_round = '2504'
# 250429기준 없는 시험 형식(A,B,C..)은 주석처리 하지 않으면 오류 발생
exam_types = [
'A',
# 'B',
# 'C',
]
# test_mode = False
test_mode = True
output_excel_paths = []
for exam_type in exam_types:
# JSON 채점기준표 파일 (예시:DIW_2503A.json)
# scoring_criteria_path = f'./DIW_{exam_round}.json'
scoring_criteria_path = f'./DIW_{exam_round}{exam_type}.json'
# xml(hml)파일 디렉토리 경로 (예시:./output/A/DIW)
# xml_directory = f'./output/{exam_type}/{"TEST" if test_mode else "DIW"}'
# 회차가 여러개인 경우
xml_directory = f'./output/{exam_round}/{exam_type}/{"TEST" if test_mode else "DIW"}'
# 오탈자 체크를 위한 정답 파일 경로 (예시:./output/A/DIW/DIW_2503A.hml)
# correct_answer_file = f'./output/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
correct_answer_file = f'./output/{exam_round}/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
# 엑셀 파일명 (비어있으면 자동생성) (예시:241001_DIW_2503A_채점결과.xlsx)
timestamp = datetime.now().strftime("%y%m%d")
output_path = f'{timestamp}_DIW_{exam_round}회_{exam_type}형_{"TEST" if test_mode else "채점결과"}.xlsx'
# 채점 클래스 초기화
scorer = XMLScorer(scoring_criteria_path)
# 폴더 내 모든 xml 파일 채점
results = scorer.score_directory(xml_directory, correct_answer_file)
# 채점 결과 엑셀로 저장
output_excel_paths.append(scorer.export_to_excel(results, output_path))
print(f"채점 결과 엑셀 파일: {output_excel_paths}")
if __name__ == '__main__':
main()

View File

@@ -532,6 +532,7 @@ class XMLScorer:
# 가로 차트일 경우에만 x축과 y축을 바꿔줌
# 세로, 꺾은선, 원형 차트의 경우 그대로 사용
if "가로" in chart_type:
if "catAx" in chart_xpath:
chart_xpath = chart_xpath.replace("catAx", "valAx")
@@ -543,10 +544,13 @@ class XMLScorer:
# valAx의 axPos(축의위치) 속성값으로 축의 방향을 구분함
elif "분산형" in chart_type:
if "catAx" in chart_xpath:
# valAx[c:axPos/@val='b'] : 값축의 위치가 bottom (가로,x축)
chart_xpath = chart_xpath.replace("catAx", "valAx[c:axPos/@val='b']")
# 분산형 차트는 catAx 대신 valAx를 사용하거나,
# catAx를 사용하더라도 bottom 위치의 축만 해당
xpath_with_valax = chart_xpath.replace("catAx", "valAx[c:axPos/@val='b']")
xpath_with_catax = chart_xpath.replace("catAx", "catAx[c:axPos/@val='b']")
# 두 경로를 OR 조건으로 결합
chart_xpath = xpath_with_valax + " | " + xpath_with_catax
elif "valAx" in chart_xpath:
# valAx[c:axPos/@val='l'] : 값축의 위치가 left (세로,y축)
chart_xpath = chart_xpath.replace("valAx", "valAx[c:axPos/@val='l']")
chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath else []
@@ -1067,13 +1071,16 @@ class XMLScorer:
'꺾은선형': "//c:lineChart[c:grouping[@val='standard']]",
'묶은가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='clustered']]",
'누적가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='stacked']]",
'100%기준누적가로막대형': "//c:barChart[c:barDir[@val='bar'] and c:grouping[@val='percentStacked']]",
'원뿔형누적가로막대형': "//c:bar3DChart[c:barDir[@val='bar'] and c:grouping[@val='stacked']]",
'묶은세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='clustered']]",
'누적세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='stacked']]",
'100%기준누적세로막대형': "//c:barChart[c:barDir[@val='col'] and c:grouping[@val='percentStacked']]",
'원형': "//c:pieChart",
'분산형': "//c:scatterChart",
'표식만있는분산형': "//c:scatterChart[c:scatterStyle[@val='marker']]",
'곡선이있는분산형': "//c:scatterChart[c:scatterStyle[@val='smooth']]"
}
chart_type = criterion.get('chart_type').replace(" ","")
@@ -1335,7 +1342,15 @@ class XMLScorer:
# XML 파일 채점
def score_directory(self, xml_directory, correct_answer_file):
# xml 파일 불러오기
xml_files = Path(xml_directory).glob('*.hml')
# xml_files = Path(xml_directory).glob('*.hml')
# 정답파일명(answer_filename)을 기준으로 xml_files 정렬
# 정답 파일이 가장 앞에 오도록)
answer_filename = Path(correct_answer_file).name # 파일명만 추출
xml_files = sorted(
Path(xml_directory).glob('*.hml'),
key=lambda f: (0 if f.name == answer_filename else 1, f.name)
)
# 채점결과 저장할 리스트
score_results = []
@@ -1386,6 +1401,7 @@ class XMLScorer:
if 'score_results' in result:
filename = {'파일명': result['filename']}
number, name = self.parse_filename(filename)
# 파일명에서 번호와 이름이 추출되지 않는 경우
if (number or name) is None:
detail_row = {'채점항목': result['filename'] }
else:
@@ -1474,7 +1490,7 @@ class XMLScorer:
def main():
# 시험회차 및 유형
exam_round = '2601'
exam_round = '2604'
# exam_round = '2522'
# 채점하고자 하는 유형은 주석 해제
@@ -1483,6 +1499,7 @@ def main():
# 'B',
'C',
# 'D',
# 'E',
]
test_mode = False
@@ -1491,17 +1508,18 @@ def main():
output_excel_paths = []
for exam_type in exam_types:
# JSON 채점기준표 파일 (예시:DIW_2503A.json)
scoring_criteria_path = f'./DIW_{exam_round}{exam_type}.json'
scoring_criteria_path = f'./JSON/{exam_round}/DIW_{exam_round}{exam_type}.json'
# xml(hml)파일 디렉토리 경로 (예시:./output/2503/A/DIW)
xml_directory = f'./output/{exam_round}/{exam_type}/{"TEST" if test_mode else "DIW"}'
# 오탈자 체크를 위한 정답 파일 경로 (예시:./output/A/DIW/DIW_2503A.hml)
# correct_answer_file = f'./output/{exam_type}/DIW/DIW_{exam_round}{exam_type}.hml'
# 오탈자 체크를 위한 정답 파일 경로
correct_answer_file = f'./output/{exam_round}/{exam_type}/{"TEST" if test_mode else "DIW"}/DIW_{exam_round}{exam_type}.hml'
# 엑셀 파일명 (비어있으면 자동생성) (예시:241001_DIW_2503A_채점결과.xlsx)
timestamp = datetime.now().strftime("%y%m%d")
output_path = f'{timestamp}_DIW_{exam_round}{exam_type}_{"TEST" if test_mode else "채점결과"}.xlsx'
output_path = f'./{timestamp}_DIW_{exam_round}{exam_type}_{"TEST" if test_mode else "채점결과"}.xlsx'
# 채점 클래스 초기화
scorer = XMLScorer(scoring_criteria_path)

File diff suppressed because it is too large Load Diff

View File

@@ -1,63 +0,0 @@
from hanspell import spell_checker
from lxml import etree as ET
import difflib
# sent = ['서울시 용일동 보건소에서 주최하는 ','즐거운 컬러푸드 영양교실', '은 제8회째 진행하는 행사입니다. 조화로운 식생활과 건강한 삶을 유지하도록 음식 재료의 빛깔만큼이나 다양한 효능이 그 속에 담겨져 있는 컬러푸드에 대한 올바른 영양지식을 제공하고 지역주민들이 직접 참여하여 각각의 맛과 특징을 살펴보고 골고루 먹기의 중요성을 컬러푸드 체험을 통하여 배울 수 있습니다. 이 밖에 아이들을 위한 영양 식단과 고혈압, 당뇨, 비만예방 식단 및 컬러푸드를 이용한 영양 간식 만들기 등 다양한 프로그램이 준비되어 있습니다. 아이들에게는 좋은 경험이 될 수 있는 이번 행사에 많은 참여 부탁드립니다.']
# spelled_check=spell_checker.check(sent)
xml_path_origin = r"/Users/waterdrw/Works/KAIT/HWP-Scoring/output/정답.hml"
xml_path = r"/Users/waterdrw/Works/KAIT/HWP-Scoring/output/워드(한글)-010036-구준호.hml"
tree = ET.parse(xml_path)
root = tree.getroot()
tree_origin = ET.parse(xml_path_origin)
root_origin = tree_origin.getroot()
# xpath로 바이너리 부분추출
input_text = root.xpath('//CHAR/text()')
input_text_origin = root_origin.xpath('//CHAR/text()')
# 각 요소에서 공백 제거
input_text = [text.replace(' ', '') for text in input_text]
input_text_origin = [text.replace(' ', '') for text in input_text_origin]
# 리스트를 하나의 문자열로 변경
input_text_str = ''.join(input_text)
input_text_origin_str = ''.join(input_text_origin)
print("input_text as string:")
print(input_text_str)
print("\ninput_text_origin as string:")
print(input_text_origin_str)
# 문자열의 차이를 비교
diff = difflib.ndiff(input_text_origin_str, input_text_str)
diff_list = list(diff)
# 차이점을 정리하여 result_diff에 저장
result_diff = []
skip_next = False
for i, line in enumerate(diff_list):
if skip_next:
skip_next = False
continue
# diff_list의 line 시작이 '-'이면서 다음 line이 '+'이면 두 line을 붙여서 맞춤법이 틀린 단어로 판단
if line.startswith('- '):
if i + 1 < len(diff_list) and diff_list[i + 1].startswith('+ '):
line = line.replace('- ', '-')
next = diff_list[i + 1].replace('+ ', '')
result_diff.append(line+'=>'+next)
skip_next = True
else:
line = line.replace('- ', '-')
result_diff.append(line)
elif line.startswith('+ '):
line = line.replace('+ ', '+')
result_diff.append(line)
# result_diff 출력
print("\nResult Differences:")
for diff in result_diff:
print(diff)

Binary file not shown.

View File

@@ -1,148 +0,0 @@
from lxml import etree
from difflib import SequenceMatcher
import json
class XMLPathHandler:
def __init__(self, xml_file_path):
"""
XML 파일을 로드하고 처리하는 핸들러
:param xml_file_path: XML 파일 경로
"""
self.tree = etree.parse(xml_file_path)
self.root = self.tree.getroot()
def similar(self, a, b):
"""
두 문자열의 유사도를 계산
:return: 유사도 점수 (0~1)
"""
return SequenceMatcher(None, a, b).ratio()
def find_similar_text(self, search_value, element_name, arg_name, threshold=0.8):
"""
XML에서 유사한 텍스트를 찾음
:param search_value: 찾고자 하는 텍스트
:param element_name: 검색할 요소 이름
:param arg_name: 검색할 속성 이름
:param threshold: 유사도 임계값
:return: 가장 유사한 텍스트와 점수
"""
# 특정 요소의 특정 속성을 가진 모든 요소 검색
xpath = f"//{element_name}[@{arg_name}]"
elements = self.root.xpath(xpath)
best_match = None
best_score = 0
for element in elements:
attr_value = element.get(arg_name)
if attr_value is not None:
score = self.similar(search_value, attr_value)
if score > threshold and score > best_score:
best_match = attr_value
best_score = score
return best_match, best_score
def build_xpath(self, item):
"""
설정 항목을 기반으로 XPath 생성
:param item: 설정 항목
:return: 구성된 XPath와 매칭된 텍스트, 유사도 점수
"""
if not all(key in item for key in ['ele', 'arg', 'searchValue']):
return None, None, 0
# 유사 텍스트 검색
matched_text, score = self.find_similar_text(
item['searchValue'],
item['ele'],
item['arg']
)
if matched_text:
# 기본 XPath 템플릿 구성
xpath = f"//{item['ele']}[@{item['arg']}='{matched_text}']"
# path가 제공된 경우, 해당 path를 기반으로 XPath 구성
if 'path' in item and item['path']:
xpath = item['path'].replace(f"[@{item['arg']}='']", f"[@{item['arg']}='{matched_text}']")
xpath = xpath.replace(f"[@{item['arg']}='searchValue']", f"[@{item['arg']}='{matched_text}']")
return xpath, matched_text, score
return None, None, 0
def process_config(self, config):
"""
설정된 JSON 설정을 처리
:param config: JSON 설정
:return: 처리된 XPath 결과들
"""
results = {}
for key, item in config.items():
results[key] = {
'original_config': item,
'processed_results': {}
}
xpath, matched_text, score = self.build_xpath(item)
if xpath:
try:
xpath_results = self.root.xpath(xpath)
results[key]['processed_results'] = {
'original_value': item['searchValue'],
'matched_value': matched_text,
'similarity_score': score,
'xpath': xpath,
'results': xpath_results
}
except etree.XPathEvalError as e:
results[key]['error'] = f"XPath evaluation error: {str(e)}"
else:
results[key]['error'] = "Unable to build XPath: missing required configuration"
return results
# 사용 예시
def main():
config = {
"0": {
"path": "//TEXTART[@Text='']/TEXTARTSHAPE/@FontName",
"ele": "TEXTART",
"arg": "Text",
"searchValue": "즐거운컬러푸드영양교실",
"value": "궁서체",
"points": 10
},
"1": {
"path": "//PARASHAPE[@Id=//TEXTART[@Text='']/ancestor::P/@ParaShape]/@Align",
"ele": "PARASHAPE",
"arg": "Align",
"searchValue": "Center",
"value": "Center",
"points": 2
}
}
xmlPath = r"C:\Users\dra\project\HWP-Scoring\output\1.hml";
handler = XMLPathHandler(xmlPath)
results = handler.process_config(config)
# 결과 출력
for key, result in results.items():
print(f"\nProcessing config item {key}:")
print(f"Original config: {result['original_config']}")
if 'error' in result:
print(f"Error: {result['error']}")
else:
processed = result['processed_results']
print(f"Generated XPath: {processed['xpath']}")
print(f"Matched text: {processed['matched_value']}")
print(f"Similarity score: {processed['similarity_score']}")
print(f"Results found: {processed['results']}")
if __name__ == "__main__":
main()

View File

@@ -1,13 +0,0 @@
# 오류 및 문제점
## 1. 원인 파악이나 해결이 어려운 경우
### 한글문서(.hwpx)에 수험자가 차트 텍스트 속성을 변경해서 저장했지만 차트 xml파일에 옵션이 적용되지 않는 경우가 있음
#### (2-50) 문항 차트 제목 굵게 속성만
1. 정상적으로 텍스트 속성이 적용되는 수험자의 차트를 복사
2. 텍스트 속성이 적용되지 않는 수험자의 한글 파일에 차트를 붙여넣을 경우
3. 정상적으로 XML파일에 텍스트 속성이 적용
- 이로 미루어 볼 때, 차트객체의 문제일 것으로 판단되지만 해결 방안은 현재 없음

View File

@@ -1,850 +0,0 @@
{
"0": {
"0": {
"path": "",
"path2": "",
"points": 0,
"category": "파일저장",
"item": "파일명 (수검번호.hwp/hwpx)"
},
"1": {
"path": "//PAGEMARGIN",
"value": {
"Top": 20,
"Bottom": 20,
"Left": 20,
"Right": 20,
"Header": 10,
"Footer": 10,
"Gutter": 0
},
"tolerance": 1,
"points": 4,
"category": "PageSetting",
"item": "A4용지, 왼쪽/오른쪽/위쪽/아래쪽 (각20mm), 머리말/꼬리말 (10mm), 제본(0mm)"
},
"2": {
"path": "",
"value": {
"FontName": "바탕",
"FontSize": "1000",
"Alignment": "Justify",
"LineSpacing": "160"
},
"points": 4,
"category": "BasicSetting",
"item": "글꼴 (바탕, 10pt), 양쪽정렬, 줄간격 (160%)"
},
"3": {
"path": "",
"value": null,
"points": 40,
"category": "오타감점",
"item": "오타 1개 -1점 / 2503회부터 오타 1개 -1점으로 변경"
}
},
"1": {
"1": {
"path": "//TEXTART[@Text='{searchValue}']/TEXTARTSHAPE/@FontName",
"searchValue": "디지털문서편집컨퍼런스",
"value": "견고딕",
"points": 1,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/① 글씨체 (견고딕)"
},
"2": {
"path": "//TEXTART[@Text='{searchValue}']/descendant::WINDOWBRUSH/@FaceColor",
"searchValue": "디지털문서편집컨퍼런스",
"value": "28,61,98",
"points": 2,
"category": "Color",
"item": "문구 (디지털문서편집컨퍼런스)/② 채우기 : 색상(RGB:28,61,98)"
},
"3": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Width",
"searchValue": "디지털문서편집컨퍼런스",
"value": "120",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털문서편집컨퍼런스)/③ 크기-너비 (120 mm)"
},
"4": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/SIZE/@Height",
"searchValue": "디지털문서편집컨퍼런스",
"value": "20",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "문구 (디지털문서편집컨퍼런스)/④ 크기-높이 (20 mm)"
},
"5": {
"path": "//TEXTART[@Text='{searchValue}']/SHAPEOBJECT/POSITION/@TreatAsChar",
"searchValue": "디지털문서편집컨퍼런스",
"value": "true",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/⑤ 위치 (글자처럼 취급)"
},
"6": {
"path": "//PARASHAPE[@Id=//P[.//TEXTART[@Text='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "디지털문서편집컨퍼런스",
"value": "Center",
"points": 2,
"category": "OneAnswer",
"item": "문구 (디지털문서편집컨퍼런스)/⑥ 정렬 (가운데 정렬)"
},
"7": {
"path": "//TEXTART[@Text='{searchValue}']",
"searchValue": "디지털문서편집컨퍼런스",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (디지털문서편집컨퍼런스)/⑦ 글맵시모양 (육안확인)"
},
"8": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]/SHAPEOBJECT/SIZE",
"searchValue": "디",
"value": {
"Height": 2800,
"Width": 2800
},
"tolerance": 200,
"points": 1,
"category": "TwoLineSize",
"item": "어/① 모양 (2줄)"
},
"9": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "디",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "어/② 글씨체 (중고딕)"
},
"10": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//WINDOWBRUSH/@FaceColor",
"searchValue": "디",
"value": "157,92,187",
"points": 2,
"category": "Color",
"item": "어/③ 면색 : 색상(RGB:157,92,187)"
},
"11": {
"path": "//RECTANGLE[.//CHAR[text()='{searchValue}']]//OUTSIDEMARGIN/@Right",
"searchValue": "디",
"value": "3.0",
"tolerance": 1,
"points": 2,
"category": "mmSize",
"item": "어/④ 본문과의 간격 : 3.0mm"
},
"12": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 세미나와 전시",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 세미나와 전시)/① BOLD"
},
"13": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]",
"searchValue": "다양한 분야의 세미나와 전시",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (다양한 분야의 세미나와 전시)/② UNDERLINE"
},
"14": {
"path": "//CHAR[contains(string(.),'{char1}')]/text()",
"path2": "//CHAR[contains(string(.),'{char2}')]/text()",
"path3": "//CHAR[contains(string(.),'{char3}')]/text()",
"char1": "■",
"char2": "■",
"char3": "※",
"value": 3,
"points": 3,
"category": "SpecialChar",
"item": "① ■, ② ■, ③ ※"
},
"15": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "행사안내",
"value": "굴림",
"points": 1,
"category": "FontName",
"item": "문구 (■ 행사안내 ■)/① 글씨체 (굴림)"
},
"16": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{match_str}')]/ancestor::P/@ParaShape]/@Align",
"match_str": "행사안내",
"value": "Center",
"points": 1,
"category": "Align",
"item": "문구 (■ 행사안내 ■)/② 정렬 (가운데 정렬)"
},
"17": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678)",
"value": "ITALIC",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678))/① ITALIC"
},
"18": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"hyperlink_ptag": "//P[.//FIELDBEGIN[@Type='Hyperlink']]",
"searchValue": "2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678)",
"value": "UNDERLINE",
"points": 1,
"category": "FontAttribute",
"item": "문구 (2025.12.24.(수) 18:00까지 전화로 등록 가능(02-1234-5678))/② UNDERLINE"
},
"19": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/following-sibling::P[1]/@ParaShape]/PARAMARGIN",
"searchValue": "기타사항",
"value": {
"Left": 10,
"Indent": 12
},
"points": 2,
"category": "ParaShape",
"item": "문구 (※ 기타… 이하 문단)/왼쪽여백 (10), 내어쓰기 (12)",
"desc": "내부적으로 내어쓰기는 음수값 / JSON value값은 양수로 입력"
},
"20": {
"path": "//CHARSHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape]/@Height",
"searchValue": "2025. 12. 20.",
"value": "1400",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/① 크기 (1400)",
"desc": "1pt당 100"
},
"21": {
"path": "//PARASHAPE[@Id=//CHAR[contains(text(),'{searchValue}')]/ancestor::P/@ParaShape]/@Align",
"searchValue": "2025. 12. 20.",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (2025. 12. 20.)/② 정렬 (가운데 정렬)"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "사단법인 스마트오피스협의회",
"value": "돋움체",
"points": 1,
"category": "FontName",
"item": "문구 (사단법인 스마트오피스협의회)/① 글씨체 (돋움체)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "사단법인 스마트오피스협의회",
"value": "2700",
"points": 1,
"category": "OneAnswer",
"item": "문구 (사단법인 스마트오피스협의회)/② 크기 (2700)"
},
"24": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/ancestor::P/@ParaShape]/@Align",
"searchValue": "사단법인 스마트오피스협의회",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "문구 (사단법인 스마트오피스협의회)/③ 정렬 (가운데 정렬)"
},
"25": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "DIAT",
"value": "궁서",
"points": 1,
"category": "Header.FontName",
"item": "문구 (DIAT)/① 글꼴 (궁서)"
},
"26": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "DIAT",
"value": "900",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/② 크기 (9pt)"
},
"27": {
"path": "//PARASHAPE[@Id=//CHAR[text()='{searchValue}']/parent::TEXT/parent::P/@ParaShape]/@Align",
"searchValue": "DIAT",
"value": "Right",
"points": 1,
"category": "Header.OneAnswer",
"item": "문구 (DIAT)/③ 정렬 (오른쪽 정렬)"
},
"28": {
"path": "//PAGENUM/@FormatType",
"value": "Ideograph",
"points": 2,
"category": "PageNumber",
"item": "① 쪽 번호 매기기 (가,나,다 순으로)",
"desc1": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
},
"desc2": "1, 2페이지 모두 정답이어야 점수 부여"
},
"29": {
"path": "//PAGENUM/@Pos",
"value": "BottomCenter",
"points": 2,
"category": "PageNumber",
"item": "왼쪽 아래",
"desc": "1, 2페이지 모두 정답이어야 점수 부여",
"desc2": {
"가운데 아래": "BottomCenter",
"오른쪽 아래": "BottomRight",
"왼쪽 아래": "BottomLeft"
}
},
"30": {
"path": "//CHAR[contains(text(),'{searchValue}')]",
"searchValue": "http",
"value": true,
"points": 2,
"category": "hyperlink",
"item": "문구 (http://www.ihd.or.kr)/하이퍼링크 없이 작성",
"desc": "searchValue에 해당하는 주소 문구에 하이퍼링크가 하나라도 설정되어 있으면 오답"
},
"31": {
"path": "//PARASHAPE[@Id='{parashape_id}']/PARAMARGIN/@LineSpacing",
"value": "190",
"first_word": "디",
"points": 2,
"category": "LineSpacing",
"item": "문제 1 줄간격 190% 설정",
"desc": "1페이지 문단의 줄간격이 정답이 아닌 문단이 있으면 False(감점), first_word 속성에 [문단 첫글자 장식]에 해당하는 글자를 입력해준다."
}
},
"2": {
"1": {
"path": "//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@HeaderInside",
"path2": "//BORDERFILL[@Id=//PAGEBORDERFILL[@Type='Both' or @Type='Even']/@BorferFill]",
"value": {
"header_inside": true,
"all_double_slim": true
},
"points": 4,
"category": "PageBorder",
"item": "문제2 쪽테두리(이중 실선, 머리말 포함) 설정"
},
"2": {
"path": "count(//SECTION)>1",
"value": true,
"points": 3,
"category": "Boolean",
"item": "① 구역나누기",
"desc": "섹션이 1개 이상이면 점수부여"
},
"3": {
"path": "./TEXT/COLDEF/@Count",
"value": "2",
"points": 3,
"category": "TwoColumn",
"item": "② 다단 2단"
},
"4": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Width",
"value": "70",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (된장의 역사와 종류)/① 크기-너비 (70 mm)"
},
"5": {
"path": "//RECTANGLE/SHAPEOBJECT/SIZE/@Height",
"value": "12",
"points": 2,
"category": "Rectangle.mmSize",
"item": "문구 (된장의 역사와 종류)/② 크기-높이 (12 mm)"
},
"6": {
"path": "//RECTANGLE//LINESHAPE",
"value": {
"Style": "DoubleSlim",
"Width": "283"
},
"points": 2,
"category": "Rectangle.LineShape",
"item": "문구 (된장의 역사와 종류)/③ 테두리 : 이중 실선(1.00mm)",
"desc": "1mm = 283pt value['Width']에 pt값 입력"
},
"7": {
"path": "//RECTANGLE/@Ratio",
"value": "50",
"points": 2,
"category": "Rectangle.OneAnswer",
"item": "문구 (된장의 역사와 종류)/④ 글상자 모서리 (반원)",
"desc": "모서리 비율 반원:50 / 둥근모양:20"
},
"8": {
"path": "//RECTANGLE//WINDOWBRUSH/@FaceColor",
"value": "227,220,193",
"points": 2,
"category": "Rectangle.Color",
"item": "문구 (된장의 역사와 종류)/⑤ 채우기 : 색상(RGB:227,220,193)"
},
"9": {
"path": "//RECTANGLE/SHAPEOBJECT/POSITION/@TreatAsChar",
"value": "true",
"points": 1,
"category": "Rectangle.OneAnswer",
"item": "문구 (된장의 역사와 종류)/⑥ 글상자 위치 (글자처럼 취급)"
},
"10": {
"path": "//PARASHAPE[@Id='{rect_parashape_id}']/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (된장의 역사와 종류)/⑦ 글상자 정렬 (가운데 정렬)"
},
"11": {
"path": ".//RECTANGLE//TEXT/@CharShape",
"value": "맑은 고딕",
"points": 1,
"category": "Rectangle.FontName",
"item": "문구 (된장의 역사와 종류)/⑧ 글씨체 (맑은 고딕)"
},
"12": {
"path": "//CHARSHAPE[@Id='{rect_charshape_id}']/@Height",
"value": "2000",
"points": 1,
"category": "Rectangle.FontSize",
"item": "문구 (된장의 역사와 종류)/⑨ 글씨크기 (2000)",
"desc": "1pt당 100"
},
"13": {
"path": "//PARASHAPE[@Id={rect_parashape_id}]/@Align",
"value": "Center",
"points": 1,
"category": "Rectangle.TextBoxAlign",
"item": "문구 (된장의 역사와 종류)/⑩ 정렬 (가운데 정렬)"
},
"14": {
"path": "//BINITEM[@BinData=//PICTURE/IMAGE/@BinItem][@Format='JPG' or @Format='JPEG' or @Format='PNG']",
"value": true,
"points": 2,
"category": "Boolean",
"item": "① 파일명 \"그림A.jpg\" 삽입",
"desc": "첨부 이미지 파일명 손상으로 정상적인 채점이 불가한 경우가 발견되어서 이미지 첨부 여부로 채점 방식 변경 (7/3)"
},
"15": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Width",
"value": "85",
"points": 2,
"category": "mmSize",
"item": "② 크기-너비 (85 mm)"
},
"16": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/SIZE/@Height",
"value": "40",
"points": 2,
"category": "mmSize",
"item": "③ 크기-높이 (40 mm)"
},
"17": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@HorzOffset",
"value": "0",
"points": 2,
"category": "mmSize",
"item": "④ 위치 (어울림 : 가로-쪽의 왼쪽 0mm)"
},
"18": {
"path": "//PICTURE[./IMAGE[@BinItem=//BINITEM[@Format='JPG' or @Format='JPEG' or @Format='PNG']/@BinData]]/SHAPEOBJECT/POSITION[not(@TreatAsChar='true') and @HorzRelTo='Page']/@VertOffset",
"value": "24",
"points": 2,
"category": "mmSize",
"item": "⑤ 위치 (어울림 : 세로-쪽의 위 24 mm)"
},
"19": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "1. 디지털 문서 편집 기술",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구① (1. 디지털 문서 편집 기술)/① 글씨체 (중고딕)"
},
"20": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "1. 디지털 문서 편집 기술",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구① (1. 디지털 문서 편집 기술)/② 크기 (1200)"
},
"21": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "1. 디지털 문서 편집 기술",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구① (1. 디지털 문서 편집 기술)/③ 진하게"
},
"22": {
"path": "//TEXT[CHAR[text()='{searchValue}']]/@CharShape",
"searchValue": "2. 문서 자동화 솔루션",
"value": "중고딕",
"points": 1,
"category": "FontName",
"item": "문구② (2. 문서 자동화 솔루션)/① 글씨체 (중고딕)"
},
"23": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "2. 문서 자동화 솔루션",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "문구② (2. 문서 자동화 솔루션)/② 크기 (1200)"
},
"24": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "2. 문서 자동화 솔루션",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "문구② (2. 문서 자동화 솔루션)/③ 진하게"
},
"25": {
"path": "boolean(//TEXT[CHAR[contains(text(),'{option}')]]/FOOTNOTE)",
"path2": "boolean(//CHAR[substring(., string-length(.) - string-length('{option}') + 1) = '{option}']/following-sibling::FOOTNOTE/descendant::CHAR)",
"option": "전자 서명",
"value": true,
"points": 2,
"category": "Boolean",
"item": "문구 (전자 서명)/① 각주 설정 및 문구 입력"
},
"26": {
"path": "//CHAR[contains(text(),'{searchValue}')]/parent::TEXT/@CharShape",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지를 위해 사용되는 기술",
"value": "돋움",
"points": 1,
"category": "FontName",
"item": "문구 (전자 서명)/② 글씨체 (돋움)"
},
"27": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape]/@Height",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지를 위해 사용되는 기술",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "문구 (전자 서명)/③ 크기 (9pt)"
},
"28": {
"path": "//P[TEXT[CHAR[contains(text(), '{searchValue}')]]]//AUTONUMFORMAT/@Type",
"searchValue": "공개키 암호화 방식을 사용하여 본인인증, 혹은 전자문서의 부인 방지를 위해 사용되는 기술",
"value": "CircledDigit",
"points": 2,
"category": "OneAnswer",
"item": "문구 (전당)/④ 각주 번호모양",
"desc": {
"가,나,다": "HangulSyllable",
"1,2,3": "Digit",
"일,이,삼": "HangulPhonetic",
"갑,을,병": "DecagonCircle",
"A,B,C": "LatinCapital",
"a,b,c": "LatinSmall",
"Ⓐ,Ⓑ,Ⓒ": "CircledLatinCapital",
"①,②,③": "CircledDigit",
"一,二,三": "Ideograph",
"㉠,㉡,㉢": "CircledHangulJamo",
"ⓐ,ⓑ,ⓒ": "CircledLatinSmall",
"㊀,㊁,㊂": "CircledIdeograph",
"i,ii,iii": "RomanSmall",
"I,II,III": "RomanCapital",
"甲,乙,丙": "DecagonCircleHanja",
"+,++,+++": "UserChar",
"*,**,***": "UserChar",
"정답에 맞는 값 value에 입력": ""
}
},
"29": {
"path": "boolean(//CHAR[contains(text(),'Security')])",
"ignoreWord": "Security",
"value": true,
"points": 3,
"category": "Boolean",
"item": "Security/영단어 미입력, 대소문자/오타 시 전체 감점",
"desc": "유사도 검사를 진행하지 않고 영단어가 모두 일치해야 하므로 xpath구문 내 단어도 수정필요"
},
"30": {
"path": "//CHAR[contains(text(),'{kor}')][contains(text(),'{chn}')]",
"word": [
["초안", "草案"],
["진위", "眞僞"],
["탑재", "搭載"],
["자동", "自動"],
["극대화", "極大化"]
],
"value": 10,
"points": 10,
"category": "Hanja",
"item": "① 초안(草案), ② 진위(眞僞), ③ 탑재(搭載), ④ 자동(自動), ⑤ 극대화(極大化)"
},
"31": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'간과비용')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…대체하면서 비용이 시간과 절감될…)>'비용이 / 시간과' 순서바꿈"
},
"32": {
"path": "boolean(//CHAR[contains(translate(text(), ' ', ''),'이필요한')])",
"value": true,
"points": 3,
"category": "Boolean",
"item": "문구 (…인력 투입이 필요해 수작업…)>'해' → '한' 글자바꿈"
},
"33": {
"path": "//TEXT[CHAR[contains(text(),'{searchValue}')]]/@CharShape",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "굴림체",
"points": 1,
"category": "FontName",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/① 글씨체 (굴림체)"
},
"34": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]/@Height",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "1100",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/② 크기 (1100)"
},
"35": {
"path": "//CHARSHAPE[@Id=//TEXT[CHAR[text()='{searchValue}']]/@CharShape]",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/③ 진하게"
},
"36": {
"path": "//PARASHAPE[@Id=//P[.//CHAR[text()='{searchValue}']]/@ParaShape]/@Align",
"searchValue": "디지털 문서 편집 기술 성장률(단위:%)",
"value": "Center",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률(단위:%))/④ 정렬 (가운데 정렬)"
},
"37": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/FILLBRUSH/WINDOWBRUSH/@FaceColor",
"value": "233,174,43",
"points": 2,
"category": "Color",
"item": "위쪽 제목 셀/① 색상(RGB:233,174,43)"
},
"38": {
"path": "//CHARSHAPE[@Id=//TABLE/ROW[1]/descendant::TEXT/@CharShape]",
"value": "BOLD",
"points": 1,
"category": "FontAttribute",
"item": "위쪽 제목 셀/② 진하게",
"desc": "글자 속성이라 CELLZONE으로 적용 되지 않음"
},
"39": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Type",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Type",
"value": "DoubleSlim",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/① 이중실선"
},
"40": {
"path": "//BORDERFILL[@Id=//TABLE/ROW[1]/CELL/@BorderFill]/BOTTOMBORDER/@Width",
"path2": "//BORDERFILL[@Id=//CELLZONE[@StartRowAddr='0' and @EndRowAddr='0' and @StartColAddr='0' and @EndColAddr=(ancestor::TABLE[1]/@ColCount)-1]/@BorderFill]/BOTTOMBORDER/@Width",
"value": "0.5mm",
"points": 2,
"category": "TableAnswer",
"item": "제목 셀 아래선/② 0.5mm"
},
"41": {
"path": "//TABLE//TEXT/@CharShape",
"path2": "//FONTFACE[@Lang='Hangul']/FONT[@Id=//CHARSHAPE[@Id=//TABLE/ROW/descendant::TEXT/@CharShape]/FONTID/@Hangul]/@Name",
"value": "굴림",
"points": 1,
"category": "TableFontName",
"category_tmp": "FontName",
"item": "글자모양/① 글씨체 (굴림)",
"desc": "테이블 폰트명 문항은 테이블의 모든 셀이 정답폰트와 일치해야 함, 하나만 일치해도 정답으로 채점할 경우 category값을 FontName으로 변경"
},
"42": {
"path": "//CHARSHAPE[@Id=//TABLE//TEXT/@CharShape]/@Height",
"value": "1000",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/② 크기 (1000)"
},
"43": {
"path": "//PARASHAPE[@Id=//TABLE/ROW//P/@ParaShape]/@Align",
"value": "Center",
"points": 1,
"category": "TableAnswer",
"item": "글자모양/③ 정렬 (가운데 정렬)"
},
"44": {
"path": "boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()]//FIELDBEGIN[starts-with(@Command, '={option}')]) and boolean(//TABLE[1]/ROW[last()]/CELL[position()=last()-1]//FIELDBEGIN[starts-with(@Command, '={option}')])",
"option": "AVG",
"value": true,
"points": 4,
"category": "Boolean",
"item": "블록 계산식/합계",
"desc": "option값에 합계는 SUM / 평균은 AVG"
},
"45": {
"chart_xpath": "",
"chart_type": "묶은 가로 막대형",
"value": true,
"points": 2,
"category": "ChartType",
"item": "① 종류 (묶은 가로 막대형)",
"desc": "chart_type을 입력받아 차트타입에 맞는 xml요소가 있는지 내부적으로 검사, chart_type만 한글로 입력해주면 된다. (공백무시)"
},
"46": {
"chart_xpath": "//c:valAx/c:majorTickMark/@val",
"value": "out",
"points": 2,
"category": "ChartOneAnswer",
"item": "② 값 축 주 눈금선",
"desc": "chart xml파일에서 답안을 가져오는 문항은 path키값 대신 chart_xpath키값을 이용해 xapth구문을 작성한다"
},
"47": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Width",
"value": "80",
"points": 2,
"category": "mmSize",
"item": "③ 크기-너비 (80 mm)"
},
"48": {
"path": "//OLE[@BinItem=//BINITEM[@Format='OLE']/@BinData]//SIZE/@Height",
"value": "90",
"points": 2,
"category": "mmSize",
"item": "④ 크기-높이 (90 mm)"
},
"49": {
"chart_xpath": "boolean(//c:chart and not(//c:pt[not(ancestor::c:tx)]/c:v[text()='합계' or text()='평균']))",
"value": true,
"points": 2,
"category": "Boolean",
"item": "⑤ 차트 데이터(표에서 블록계산식을 제외한 나머지 값만 이용)",
"desc": "차트가 존재하고 블록계산식(합계, 평균) 데이터가 없는 경우 정답 처리"
},
"50": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r//a:ea/@typeface",
"searchValue": "디지털 문서 편집 기술 성장률",
"value": "휴먼옛체",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/① 글씨체 (휴먼옛체)"
},
"51": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@sz",
"searchValue": "디지털 문서 편집 기술 성장률",
"value": "1200",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/② 크기 (1200)"
},
"52": {
"chart_xpath": "//a:t[text()='{searchValue}']/ancestor::a:r/a:rPr/@{option}",
"option": "b",
"searchValue": "디지털 문서 편집 기술 성장률",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "제목 문구 (디지털 문서 편집 기술 성장률)/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"53": {
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/① 글꼴 (궁서)"
},
"54": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/② 크기 (9pt)"
},
"55": {
"chart_xpath": "//c:catAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "X축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"56": {
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
"value": "궁서",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/① 글꼴 (궁서)"
},
"57": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/② 크기 (9pt)"
},
"58": {
"chart_xpath": "//c:valAx/c:txPr//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "ChartOneAnswer",
"item": "Y축/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
},
"59": {
"chart_xpath": "//c:legend//a:ea/@typeface",
"value": "궁서",
"points": 1,
"category": "OneAnswer",
"item": "범례/① 글꼴 (궁서)"
},
"60": {
"chart_xpath": "//c:legend//a:defRPr/@sz",
"value": "900",
"points": 1,
"category": "OneAnswer",
"item": "범례/② 크기 (9pt)"
},
"61": {
"chart_xpath": "//c:legend//a:defRPr/@{option}",
"option": "i",
"value": "1",
"points": 1,
"category": "OneAnswer",
"item": "범례/③ 기울임",
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
}
}
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

Some files were not shown because too many files have changed in this diff Show More