2017-01-09 1 views
0

대용량 XML 파일을 XSLT 변환을 사용하여 100 또는 1000처럼 상수를 설정 한 레코드 카운터에 따라 여러 파일로 분할해야한다는 요구 사항이 있습니다.XSLT 1.0을 사용하여 XML 파일을 카운터 값으로 사용하여

특정 노드 값은 전체 파일에 대해 한 번만 사용할 수 있습니다. 특정 노드 값은 각 파일에 그대로 복사해야합니다. Like 헤더 정보 또는 purchaseOrder 번호

xslt 1.0 버전을 사용해야합니다. 내 중간 도자기 시스템에 2.0 지원 파서가 없습니다. 예제 파일은 다음과 같습니다. 위의 파일에서

<?xml version="1.0" encoding="UTF-8"?> 
 
<ns0:HeaderOffile xmlns:ns0="http://cdpa.com/xix/ALS"> 
 
\t <EPBody> 
 
\t \t <EList> 
 
\t \t \t <AgEvent> 
 
\t \t \t \t <parentId>77777</parentId> 
 
\t \t \t \t <childId> 
 
\t \t \t \t \t <epic>400</epic> 
 
\t \t \t \t \t <epic>401</epic> 
 
\t \t \t \t </childId> 
 
\t \t \t \t <extensions> 
 
\t \t \t \t \t <SExtension> 
 
\t \t \t \t \t \t <epic>400</epic> 
 
\t \t \t \t \t \t <NameValue> 
 
\t \t \t \t \t \t \t <PName>SERVICE</PName> 
 
\t \t \t \t \t \t \t <PValue>03</PValue> 
 
\t \t \t \t \t \t </NameValue> 
 
\t \t \t \t \t </SExtension> 
 
\t \t \t \t \t <OneTimeForFile> 
 
\t \t \t \t \t \t <NameValue> 
 
\t \t \t \t \t \t \t <PName>ZFIELD1</PName> 
 
\t \t \t \t \t \t \t <PValue>ROYAL</PValue> 
 
\t \t \t \t \t \t </NameValue> 
 
\t \t \t \t \t \t <NameValue> 
 
\t \t \t \t \t \t \t <ParameterName>ZFIELD2</ParameterName> 
 
\t \t \t \t \t \t \t <PValue>GOLD</PValue> 
 
\t \t \t \t \t \t </NameValue> 
 
\t \t \t \t \t </OneTimeForFile> 
 
\t \t \t \t </extensions> 
 
\t \t \t </AgEvent> 
 
\t \t \t <AgEvent> 
 
\t \t \t \t <parentId>88888</parentId> 
 
\t \t \t \t <childId> 
 
\t \t \t \t \t <epic>300</epic> 
 
\t \t \t \t \t <epic>301</epic> 
 
\t \t \t \t </childId> 
 
\t \t \t \t <extensions> 
 
\t \t \t \t \t <SExtension> 
 
\t \t \t \t \t \t <epic>300</epic> 
 
\t \t \t \t \t \t <NameValue> 
 
\t \t \t \t \t \t \t <PName>SERVICE</PName> 
 
\t \t \t \t \t \t \t <PValue>03</PValue> 
 
\t \t \t \t \t \t </NameValue> 
 
\t \t \t \t \t </SExtension> 
 
\t \t \t \t </extensions> 
 
\t \t \t </AgEvent> 
 
\t \t \t <AgEvent> 
 
\t \t \t \t <parentId>99999</parentId> 
 
\t \t \t \t <childId> 
 
\t \t \t \t \t <epic>200</epic> 
 
\t \t \t \t \t <epic>201</epic> 
 
\t \t \t \t </childId> 
 
\t \t \t \t <extensions> 
 
\t \t \t \t \t <SExtension> 
 
\t \t \t \t \t \t <epic>200</epic> 
 
\t \t \t \t \t \t <NameValue> 
 
\t \t \t \t \t \t \t <PName>SERVICE</PName> 
 
\t \t \t \t \t \t \t <PValue>03</PValue> 
 
\t \t \t \t \t \t </NameValue> 
 
\t \t \t \t \t </SExtension> 
 
\t \t \t \t </extensions> 
 
\t \t \t </AgEvent> 
 
\t \t </EList> 
 
\t </EPBody> 
 
</ns0:HeaderOffile>
나는 각 100 개 AGEvent 노드에 대한 예를 들어, 내가 설정 카운트의 AGEvent 노드에서 파일을 분할 할 필요가있다. 파일에 560 개의 AGEvent 노드가있는 경우 6 개의 파일, 5 개의 파일에 각각 100 개, 마지막 6 번째 파일에 60 개의 AGEvent 노드가 있습니다.

OneTimeForFile 노드는 입력 파일에서 한 번만 사용할 수 있으므로 첫 번째 AGEvent 노드에 파일 당 한 번 복사해야합니다.

완전한 XSLT 스크립트를 작성하고 궁금한 점이 있으면 알려주세요. 웹 검색으로 문제를 해결할 수있는 방법을 찾았습니다.

나는 post here으로 시도했다! 그러나 달성되지 않았습니다. 귀중한 시간을 매우 높이 평가합니다. 미리 감사드립니다.

+0

XSLT 1.0에서는 입력을 여러 출력 파일로 분할 할 수 없습니다. 프로세서에서 지원하는 경우 EXSLT'exsl : document' 확장 명령어를 사용할 수 있습니다. 그렇지 않으면 매개 변수를 100 씩 올릴 때마다 호출 응용 프로그램에 다중 변환을 수행하도록 지시해야합니다. 그러면 호출 응용 프로그램에 총 AGEvent 노드 수를 전달하는 방법을 찾아야합니다. - 추신 연결된 질문에 아무런 연관이 없습니다. –

+0

감사합니다. 나는 그것을 해결했다. – Nag

답변

0

XSLT 1.0을 사용하여 여러 파일로 파일을 분할하는 두 가지 방법이 있습니다 :

  1. 를 사용하여 공급 업체 확장. 이를 위해서는 어떤 XSLT 프로세서를 사용하고 있는지 알고 있어야합니다.
  2. 일반적으로 스타일 시트에 매개 변수를 제공하여 각 특정 실행에서 생성하려는 파티션을 나타내는 여러 변환을 출력 파일 당 하나씩 사용하십시오. 이를 위해서는 변환을 호출하는 방법에 대해 더 많이 알아야합니다.
+0

감사합니다. 나는 XSLT를 사용한다. 나는 내가 원하는 것을 스스로 해결했다. – Nag

+1

제기 한 문제를 해결하는 경우, 미래의 방문자가 사이트를 방문했을 때의 의문으로 답을 해결하십시오. –

관련 문제