2013-05-04 2 views
0

XSLT 스타일 시트를 사용하여 하나의 XML 문서를 다른 XML 형식으로 변환하는 새 프로젝트가 지정되었습니다.XSLT for XML to XML quandary

저는 지난 4 시간 동안 StackOverflow 및 온라인 다른 곳에서 원하는 결과를 얻을 수있는 방법을 찾으려고 애썼지 만 찾을 수있는 방법은 없습니다.

여기에 원래의 문서 형식입니다 :

<?xml version="1.0"?> 
<PODOrderSheet_Main> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
    <estimate> 
     <customer>LINFNC</customer> 
     <jobType>5020</jobType> 
     <JobParts> 
      <JobPart> 
       <jobPart>01</jobPart> 
       <contactNum/> 
       <JobNotes> 
        <JobNote> 
         <department>001</department> 
         <jobPart>01</jobPart> 
         <note><![CDATA[Rush Order]]></note> 
        </JobNote> 
       </JobNotes> 
      </JobPart> 
     </JobParts> 
    </estimate> 
</PODOrderSheet_Main> 

그리고 여기가 볼 필요가있다 방법은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE estimate> 
<estimate> 
    <customer>LINFNC</customer> 
    <jobType>5020</jobType> 
    <JobParts> 
     <JobPart> 
      <jobPart>01</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>01</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
     <JobPart> 
      <jobPart>02</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>02</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
     <JobPart> 
      <jobPart>03</jobPart> 
      <contactNum/> 
      <JobNotes> 
       <JobNote> 
        <department>001</department> 
        <jobPart>03</jobPart> 
        <note><![CDATA[Rush Order]]></note> 
       </JobNote> 
      </JobNotes> 
     </JobPart> 
    </JobParts> 
</estimate> 

나는 아무 문제없이 모든 요소를 ​​복사 할 수 있어요. 내가 갇혀있는 곳은 customerjobType 요소의 첫 번째 항목 만 필요하지만 여러 estimate 블록의 모든 포함 된 JobParts은 모두 jobPart 요소에 해당하는 순서대로 번호가 매겨져 있습니다.

누군가가이 프로젝트의 올바른 방향으로 나를 가리킬 수 있다면 나는 매우 감사 할 것입니다.

+0

이이 문제를 그룹화의 예입니다 무엇을해야 할 것 같다, 그래서 해결하기 위해 너무 열심히해서는 안됩니다. XSLT1.0 또는 XSLT2.0을 사용하고 있습니까? 문제가 해결되는 방법에 차이가 있습니까? 또한 고객이 서로 다른 'jobType'요소를 가질 수 있을까요? 어떤 경우에, 당신은 그들이 같은 그룹에 개별적으로 또는 함께 그룹화되기를 원할 것입니까? 감사! –

+0

입력 예제가 출력과 일치하지 않는 것 같습니다. 예 : 입력에 ''등이 없습니다. –

+0

안녕하세요. 응답 해 주셔서 감사합니다. 이것은 XSLT 1.0이며 jobType 요소는 항상 첫 번째 예상 블록에서 수집 된 요소입니다. –

답변

0

이 문제는 그룹화 문제로 생각되지 않습니다. 최대한 멀리 볼 수있는 첫 번째 customerjobType 요소가 출력의 시작 부분에 복사해야합니다. 그 후에는 단지 JobPart 요소의 사본 일뿐입니다. jobPart (작은j - 그곳에서 기다리는 고치 잡기) 요소는 소스 데이터의 요소 인 JobPart에 따라 번호를 부여하는 자체 템플릿을 갖습니다. 이 변환

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/PODOrderSheet_Main"> 
     <estimate> 
      <xsl:copy-of select="estimate[1]/customer"/> 
      <xsl:copy-of select="estimate[1]/jobType"/> 
      <JobParts> 
       <xsl:apply-templates select="estimate/JobParts/JobPart"/> 
      </JobParts> 
     </estimate> 
    </xsl:template> 

    <xsl:template match="jobPart"> 
     <xsl:copy><xsl:number count="JobPart" level="any" format="01"/></xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

출력

<?xml version="1.0" encoding="utf-8"?> 
<estimate> 
    <customer>LINFNC</customer> 
    <jobType>5020</jobType> 
    <JobParts> 
     <JobPart> 
     <jobPart>01</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>01</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
     <JobPart> 
     <jobPart>02</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>02</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
     <JobPart> 
     <jobPart>03</jobPart> 
     <contactNum/> 
     <JobNotes> 
      <JobNote> 
       <department>001</department> 
       <jobPart>03</jobPart> 
       <note>Rush Order</note> 
      </JobNote> 
     </JobNotes> 
     </JobPart> 
    </JobParts> 
</estimate> 
+0

이것은 훌륭하게 작동했습니다. 당신의 도움을 주셔서 감사합니다. 이제 복사 된 값 중 일부에 텍스트 문자열을 추가하거나 추가해야하지만이 방법을 사용하면 목표를 달성하는 데 큰 도움이됩니다. 이 작업을 올바르게 수행하는 방법을 보여 주셔서 다시 한 번 감사드립니다. –