2017-10-26 6 views
0

큰 XML 파일이 있고 여러 일치 기준에 따라 다른 XML 문서의 값으로 특정 값을 변경해야합니다.여러 일치 기준에 따라 다른 XML 파일에서 참조 된 값을 기반으로 XML 값을 변경하십시오.

내 큰 XML 파일 'file1.xml은'형식은 다음과 같습니다

<institution> 
<ukprn>1234</ukprn> 
<course> 
    <courseID>1</courseID> 
    <courseaim>X99</courseaim> 
</course> 
<student> 
    <birthdate>30/10/1985</birthdate> 
    <instance> 
     <OWNINST>1558310|1</OWNINST> 
     <FC>1</FC> 
     <STULOAD>100</STULOAD> 
     <elq>4</elq> 
     <MODE>31</MODE> 
     <StudentOnModule> 
       <MODID>08|29400</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>08|29091</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
    </instance> 
</student> 
<student> 
    <birthdate>01/02/1999</birthdate> 
    <instance> 
     <OWNINST>654321|1</OWNINST> 
     <FC>2</FC> 
     <elq>2</elq> 
     <StudentOnModule> 
       <MODID>02|37522</MODID> 
       <MODOUT>6</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>02|48966</MODID> 
       <MODOUT>1</MODOUT> 
     </StudentOnModule> 
    </instance> 
    <instance> 
     <OWNINST>654321|2</OWNINST> 
     <FC>6</FC> 
     <elq>1</elq> 
     <StudentOnModule> 
       <MODID>08|29400</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>08|29091</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
    </instance> 
</student> 
</institution> 

내가 두 번째 파일 'file1.xml'을 업데이트 할 데이터가 포함 된 'file2.xml'을 가지고있다. 다음과 같이 구성되어있다 : 'File2.xml'에서 각 학생에 대한
<studentstoamend> 
<student><OWNINST>1558310|1</OWNINST><MODID>08|29400</MODID><MODOUT>6</MODOUT></student> 
<student><OWNINST>1558310|1</OWNINST><MODID>08|29091</MODID><MODOUT>6</MODOUT></student> 
</studentstoamend> 

내가 File2.xml의 값이 될 File1.xml에서 MODOUT를 업데이트합니다. 예를 들어, File1.xml : OWNINST = 1558310 | 1, MODID = 08 | 29400은 MODOUT = 4이지만 File2.xml은 MODOUT = 6을 지정하므로 특정 OWNINST/MODOUT 조합에 대해 File1.xml을 MODOUT = 6으로 업데이트해야합니다 . 출력 파일은 file1.xml의 정확한 사본이어야하지만 File2.xml에 지정된 변경 사항이 있어야합니다.

제 생각에는 작동하지 않을 것 같으니 도와주세요.

이것은 내가 가지고 얼마나 멀리입니다 :

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="Student/Instance[OWNINST = document('file2.xml')/studentstoamend/STUDENT/OWNINST/MODID]/MODOUT"> 
     <xsl:copy-of select="document('file2.xml')/studentstoamend/STUDENT[OWNINST = current()/../OWNINST]/MODID[MODID = current()/MODID]/MODOUT"/> 
    </xsl:template> 

</xsl:stylesheet> 

그래서 출력 파일은 다음과 같아야합니다이보고에 대한

<institution> 
<ukprn>1234</ukprn> 
<course> 
    <courseID>1</courseID> 
    <courseaim>X99</courseaim> 
</course> 
<student> 
    <birthdate>30/10/1985</birthdate> 
    <instance> 
     <OWNINST>1558310|1</OWNINST> 
     <FC>1</FC> 
     <STULOAD>100</STULOAD> 
     <elq>4</elq> 
     <MODE>31</MODE> 
     <StudentOnModule> 
       <MODID>08|29400</MODID> 
       <MODOUT>6</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>08|29091</MODID> 
       <MODOUT>6</MODOUT> 
     </StudentOnModule> 
    </instance> 
</student> 
<student> 
    <birthdate>01/02/1999</birthdate> 
    <instance> 
     <OWNINST>654321|1</OWNINST> 
     <FC>2</FC> 
     <elq>2</elq> 
     <StudentOnModule> 
       <MODID>02|37522</MODID> 
       <MODOUT>6</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>02|48966</MODID> 
       <MODOUT>1</MODOUT> 
     </StudentOnModule> 
    </instance> 
    <instance> 
     <OWNINST>654321|2</OWNINST> 
     <FC>6</FC> 
     <elq>1</elq> 
     <StudentOnModule> 
       <MODID>08|29400</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
     <StudentOnModule> 
       <MODID>08|29091</MODID> 
       <MODOUT>4</MODOUT> 
     </StudentOnModule> 
    </instance> 
</student> 
</institution> 

정말 감사합니다. 마틴

답변

1

주의 할 점은 XML (그리고 XSLT)는 대소 문자를 구분, 따라서 경로에 Student를 포함하는 템플릿이 XML에 student 요소를 일치하지 않을.

또 다른 문제는 경로에서 요소를 빠뜨린 것입니다. 예를 들어 StudentOnModuleMODOUT의 부모이며 인스턴스가 아닙니다.

이 템플릿을 시도

....

<xsl:template match="student/instance[OWNINST = document('file2.xml')/studentstoamend/student/OWNINST]/StudentOnModule/MODOUT"> 
    <xsl:copy-of select="document('file2.xml')/studentstoamend/student[OWNINST = current()/../../OWNINST][MODID = current()/../MODID]/MODOUT"/> 
</xsl:template> 

주, 나는

<xsl:template match="MODOUT"> 
    <xsl:variable name="modout" select="document('file2.xml')/studentstoamend/student[OWNINST = current()/../../OWNINST][MODID = current()/../MODID]/MODOUT" /> 
    <xsl:choose> 
     <xsl:when test="$modout"> 
      <xsl:copy-of select="$modout" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy-of select="." /> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

하이 팀 .... 두 번째 파일을 참조하는 것을 피하기 위해, 템플릿을 단순화하기 위해 유혹 될 수있다 , 그것을 보아 주셔서 고맙습니다 - 최고의 솔루션은 작동하지 않았지만 재 작성되고 단순화 된 템플릿은 완벽하게 작동했습니다. 생명을 구하는 사람, 고마워요 !! – MartinB