2012-03-09 3 views
2

나는 다음과 같은 XML 구조를 가지고 :XSLT 일괄 처리

<School> 
    <SchoolInfo> 
    <SchoolName>The Big School</SchoolName> 
    <Opened>2008</Opened> 
    <SchoolID>SCH1122</SchoolID> 
    <Geograpics> 
     <Location>London</Location> 
     <PostCode>ZZ11 1ZZ</PostCode> 
    </Geographics> 
    </SchoolInfo> 
    <Pupil> 
    <Name>Tom</Name> 
    <LastName>Jones</LastName> 
    <Class>12B</Class> 
    <Age>16</Age> 
    </Pupil> 
    <Pupil> 
    <Name>Steve</Name> 
    <LastName>Jobs</LastName> 
    <Class>09A</Class> 
    <Age>17</Age> 
    </Pupil> 
    <Pupil> 
    <Name>Joe</Name> 
    <LastName>Blogs</LastName> 
    <Class>13A</Class> 
    <Age>15</Age> 
    </Pupil> 
</School> 

내 XML 구조 .. 말 400 명 학생들 포함했고, 나는 50의 일괄 처리를 처리하고 각 50 PSV의 분리해서하기 위해 쓰고 싶다 경우 학생, 처음 50, 다음 50-100, 다음 100-150 등등 및 새 파일에 각 일괄 쓰기 .. 이것은 XSLT를 사용하여 할 수 또는 programatic해야할까요?

이제 PSV 등으로 처리하는 코드가 있습니다. 솔직하게 실마리가 없으므로 일괄 적으로 처리하는 방법을 고수하고 있습니다.

- PSV는 :

private string PerformTransformation(string FilePath) 
{ 
    string fullXsltFile; 

    if (chkDateIncrement.Checked == false) 
     fullXsltFile = Resources.XSLTTest; // Resources.XSLT; 
    else 
     fullXsltFile = Resources.XSLTTest; 

    XmlDocument xsltTransformDocument = new XmlDocument(); 
    xsltTransformDocument.LoadXml(fullXsltFile); 

    FileInfo xmlFileInfo = new FileInfo(FilePath); 
    string outputFile = CreateXmlOutputFileName(xmlFileInfo); 

    // load the Xslt with any settings 
    XslCompiledTransform transformation = new XslCompiledTransform(); 
    XsltSettings settings = new XsltSettings(true, false); 
    settings.EnableScript = true; 
    transformation.Load(xsltTransformDocument, settings, new XmlUrlResolver()); 

    using (XmlReader reader = XmlReader.Create(FilePath)) 
    { 
     using (FileStream stream = new FileStream(outputFile, FileMode.Create)) 
     { 
      transformation.Transform(reader, null, stream); 
      stream.Close(); 
     } 
     reader.Close(); 
    } 
    return outputFile; 
} 

나는 또한 VS2010와 마이크로 소프트의 processer 너무 슬프게하지 않습니다을 사용하고 있습니다 : 파이프 구분은

SCH1122|London|Tom|12B|16 
SCH1122|London|Steve|09A|17 
SCH1122|London|Joe|13A|15 

다음과 같이 XML은 변환하는 데 사용되는 코드 값 따라서 v2.0을 지원해야하므로 v1.0이어야합니다. XSLT

표준 xslt1.0 빌드에서이 작업을 수행하는 방법은 addit onal 구성 요소는 가장 쉬운 일이 아닙니다.

+0

정확한 결과를 제공하십시오. 또한, PSV가 무엇을 의미하는지 모두 추측 할 수있는 것은 아닙니다. 현재의 추측은 "파이프로 구분 된 값"입니다. 질문을 편집하고 필요한 정보를 제공해주십시오. –

+0

물론 XSLT는 "프로그래밍 방식"입니다. –

+0

저는 데이터를 처리 (예 : 400 명의 학생과 50 개의 .txt 파일 만 처리 할 수 ​​있으므로 8 개의 파일을 만듭니다) 한 후에 실제 출력 구조가 아닙니다. 당신은 아래 XML 예제 단락에서 말한 것처럼 XML을 제공했습니다. – Mike

답변

1

순수 XSLT 1.0에서는 두 개 이상의 결과 문서을 생성 할 수 없습니다.

이렇게하려면 별도의 파일에 요소를 저장하기 위해 확장 기능 (작성해야 함)을 호출해야합니다.

how to write an extension function에 대한 MSDN 설명서를 읽어야합니다.

변환 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pBatchLength" select="2"/> 

<xsl:variable name="vId" select="/*/SchoolInfo/SchoolID"/> 
<xsl:variable name="vLoc" select="/*/SchoolInfo/Geographics/Location"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates select="Pupil[position() mod $pBatchLength = 1]"/> 
</xsl:template> 

<xsl:template match="Pupil"> 
    <xsl:variable name="vrtfBatch"> 
    <batch> 
     <xsl:apply-templates mode="inbatch" select= 
     ". | following-sibling::Pupil[not(position() > $pBatchLength -1)]"/> 
    </batch> 
    </xsl:variable> 

    <xsl:value-of select= 
     "my:writeResult($vrtfBatch, ceiling(position() div $pBatchLength))"/> 
</xsl:template> 

<xsl:template match="Pupil" mode="inbatch"> 
    <xsl:value-of select= 
    "concat('&#xA;', $vId, '|', $vLoc, '|', Name, '|', Class, '|', Age)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

설명 :

"배치"의 원하는 길이에 대해 (전역/외부 파라미터 $pBatchLength하고 디폴트 값에 지정된
  1. 우리의 작은 데모 예제는 2으로 정의됩니다.

  2. 모두 PupilPupil 새 배치를 시작하는 요소는 익명 모드로 처리됩니다.

  3. 일괄 처리는 batch 요소로 래핑됩니다 (그렇지 않은 경우이 코드는 삭제 될 수 있음). 그런 다음 현재 배치를 포함하는 모든 Pupil 요소가 "inbatch" 모드에서 처리되고 각각에 대해 필요한 CSV 입력이 생성됩니다.

  4. iutput은 $vrtfBatch이라는 변수에 캡처됩니다.확장 기능 (작성해야 함) my:writeResult은 매개 변수 $vrtfBatch 및이 배치의 일련 번호와 함께 호출됩니다. 확장 기능은 파일 이름에 seq. no를 사용하여 새 파일을 만들고 내용을 기록해야합니다.

+0

여기서 높은 수준에서 일어나는 일에 대한 논리를 설명해 주시겠습니까? – Mike

0

xslt를 사용하여이 작업을 수행 할 수 있습니다. Here is good example how to do it.

+0

리디렉션에 대한 Microsoft 네임 스페이스는 특정 프로세서 용으로 작성된 것으로 알고 있습니까? – Mike

+0

실제로 직접적으로 msxml에서 "리디렉션"하는 것과 유사한 것은 없지만 결과 트리 조각을 매개 변수로 받아들이는 Javascript 메서드이며 Microsoft의 DOM 구현에서 사용할 수있는 메서드를 사용하여 직렬화합니다. –

+0

슬프게도 나는 자바 스크립트에 대해 모른다는 것을 배웠으므로 규칙은 하나가된다. – Mike

0

나는 한 번에 일정량을 얻기위한 프로그래밍 방식으로 비슷한 질문 인 here에 대답합니다.