2017-10-26 17 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」を更新するためのデータを含む第2のファイル「file2.xml」を持っています。私はFile2.xmlの値になることをFile1.xmlでMODOUTを更新したい「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> 

:それは、このように構成されています。たとえば、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の親でありインスタンスではありません。 、私は1秒間に2回ファイルを参照することを避けるために、テンプレートを簡単にするために誘惑されるかもしれません

このテンプレートを試してみてください....

<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

関連する問題