我有一个大型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>
我有第二个文件'file2.xml',其中包含要更新'file1.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以成为File2.xml中的值。例如,在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>
非常感谢您对此的看法。 马丁
答案 0 :(得分:1)
需要注意的主要事项是XML(和XSLT)区分大小写,因此路径中包含Student
的模板不会与XML中的student
元素匹配。< / p>
另一个问题是您错过了路径中的元素,例如StudentOnModule
是MODOUT
的父级,而不是实例。
试试这个模板......
<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>