최근에이 질문을했지만 매우 명확하게 설명하지 않았다는 것을 알고 있습니다. 인보이스 당 여러 줄의 큰 .csv 파일 (8000+ 회선)이 있습니다. 아래에 표시된 XML 구조로 구문 분석하고 있습니다 (단순화).XSLT 큰 단일 부모 노드를 더 작은 하위 노드로 분할
입력 1 - $ XMLInput
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<invoiceNumber>1</invoiceNumber>
<invoiceText>invoice 1-1</invoiceText>
<position>1<position>
...
</row>
<row>
<invoiceNumber>1</invoiceNumber>
<invoiceText>invoice 1-2</invoiceText>
<position>2<position>
...
</row>
<row>
<invoiceNumber>2</invoiceNumber>
<invoiceText>invoice 2-1</invoiceText>
<position>3<position>
...
</row>
<row>
<invoiceNumber>2</invoiceNumber>
<invoiceText>invoice 2-2</invoiceText>
<position>4<position>
...
</row>
<row>
<invoiceNumber>3</invoiceNumber>
<invoiceText>invoice 3-1</invoiceText>
<position>5<position>
...
</row>
<row>
<invoiceNumber>3</invoiceNumber>
<invoiceText>invoice 3-2</invoiceText>
<position>6<position>
...
</row>
</roow>
입력 2 - $ maxBatchSize 설명 :이
입력 (일정)이 크기보다 큰 도착 후 다음 배치에 브레이크 3 - $ listOfInvoices에게 설명 : 문서에서 고유 한 송장 번호의 반복 변수. 예 :
<root>
<row>
<invoiceNumber>1</invoiceNumber>
</row>
<row>
<invoiceNumber>2</invoiceNumber>
</row>
<row>
<invoiceNumber>3</invoiceNumber>
</row>
</root>
성능 시간을 개선하려면, 나는 X보다 크지 배치에 INVOICENUMBER하여 이러한 요소 (가져올 변수) 각 노드 그룹에 필요합니다. 거기서 나는 한 번에 전체 원본 문서를 처리하는 대신 각 배치를 하위 프로세서에 병렬로 전송합니다. $ XMLOutput
<root>
<batch>
<row>
<invoiceNumber>1</invoiceNumber>
<invoiceText>invoice 1-1</invoiceText>
<position>1<position>
...
</row>
<row>
<invoiceNumber>1</invoiceNumber>
<invoiceText>invoice 1-2</invoiceText>
<position>2<position>
...
</row>
<row>
<invoiceNumber>2</invoiceNumber>
<invoiceText>invoice 2-1</invoiceText>
<position>3<position>
...
</row>
<row>
<invoiceNumber>2</invoiceNumber>
<invoiceText>invoice 2-2</invoiceText>
<position>4<position>
...
</row>
</batch>
<batch>
<row>
<invoiceNumber>3</invoiceNumber>
<invoiceText>invoice 3-1</invoiceText>
<position>5<position>
...
</row>
<row>
<invoiceNumber>3</invoiceNumber>
<invoiceText>invoice 3-2</invoiceText>
<position>6<position>
...
</row>
</batch>
</root>
그것은 모든 요구 사항입니다 -
출력 1 : 예를 들면, 위의 예제 XML의 문서에서, 배치 크기는 나는 다음과 같은 XML 출력을 필요, 3보다 큰있을 수 있다면 송장의 행은 동일한 배치로 보내집니다. 내 초기 XSLT 시도가 아래 (2.0)이며, while 루프를 에뮬레이트하려고 시도하고 템플릿을 재귀 적으로 호출하여 현재 노드에 송장 그룹을 계속 추가합니다. 최대 일괄 처리 크기에 도달하면 재귀 적으로 일괄 처리 템플릿을 호출하여 새 일괄 처리를 만듭니다. 각 순환 호출간에 송장 및 배치 카운터를 전달합니다.
편집 : Ken의 도움 덕분에 더 가까워지고 있습니다. 개별 송장 수가 아닌 매번 회선 수별로 송장을 분할해야합니다. 이론적으로 아래의 내용이 작동하는 경우 인보이스 번호가 선행 형제 노드에 존재하지 않는지 확인하는 방법이 확실하지 않습니다.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:variable name="batch-size" select="40" as="xs:integer"/>
<xsl:variable name="input" select="bpws:getVariableData('sortedInvoicesByBU')"/>
<xsl:key name="invoice-lines-by-invoice-number" match="row" use="invoiceNumber4z"/>
<xsl:template match="/">
<xsl:element name="batches">
<!--establish batches from possible non-contiguous invoice numbers-->
<xsl:for-each-group select="$input/*:UPSData/*:row" group-by="(position() - 1) idiv $batch-size">
<xsl:for-each select="distinct-values($input/*:UPSData/*:row/*:invoiceNumber4z)[not(.=preceding-sibling::item)]">
<xsl:element name="UPSData">
<xsl:for-each select="current()">
<xsl:for-each select="key('invoice-lines-by-invoice-number',.,$input)">
<!--copy rows as they are-->
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:for-each-group>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
다시 감사합니다. 나는 프로그래밍 방식으로 XSLT를 적절하게 적용하려고 노력하고 있었고, 기능적 언어로 생각하는 법을 배우기 시작했습니다. 시도한 프로그래밍 방식이 효과가없는 이유는 그것이 설계된 방식이 아니기 때문입니다. – rwolters3
당신이 도왔던 두 가지 질문이 내 책을 다운로드하고 공부하고, 내 영역에 강의/수업이 있는지, 이전 강좌의 캐시 된 버전인지를 확인하는 것이 좋을 것 같습니다. :) 또한 내가 만든 작은 오타가 있었는데, 나는 8000 또는 8k 레코드가 아니라 800 만, 훨씬 더 빠른 처리 시간을 말하고자했습니다. – rwolters3
내 StackOverflow 프로필을 곧 다가올 강의 시리즈로 업데이트하거나 http://www.CraneSoftwrights.com/schedule.htm#calendar에 정보가 있습니다. 그리고 http://www.CraneSoftwrights.com/links/udemy-ptux-online.htm에서 XSLT/XPath에 5 시간 분량의 무료 스트리밍 비디오 강좌가 있습니다. 사용자 이름을 설정하지 않아도됩니다. 그냥 자유롭게 보아라. Udemy는 http://www.CraneSoftwrights.com/training/ptux/ptux-video.htm 페이지를 통해 구입할 수있는 DVD 스트리밍 버전을 호스팅합니다. 둘 다 완전한 답을 가진 연습 문제가 있습니다. 독립 실행 형 서적에는 연습 문제가 없습니다. –