如何更改某些节点(在另一个XML文件中引用)的XML文件中的值?

时间:2015-09-16 17:24:55

标签: xml xslt

我有一个大型XML文件,我需要在其中设置某些值为' 2'其中父节点的ID号与另一个XML文件中的ID号相匹配。

我的大型XML文件' file1.xml'采用以下格式:

    <institution>
    <ukprn>1234</ukprn>
    <course>
        <courseID>1</courseID>
        <courseaim>X99</courseaim>
    </course>
    <student>
        <birthdate>30/10/1985</birthdate>
        <instance>
            <OWNINST>123456|5</OWNINST>
            <FC>1</FC>
            <elq>4</elq>
        </instance>
    </student>
    <student>
        <birthdate>01/02/1999</birthdate>
        <instance>
            <OWNINST>654321|1</OWNINST>
            <FC>2</FC>
            <elq>2</elq>
        </instance>
        <instance>
            <OWNINST>654321|2</OWNINST>
            <FC>6</FC>
            <elq>1</elq>
        </instance>
    </student>
</institution>

有多个学生,每个学生可以有多个实例。

我有另一个xml文件&#39; File2.xml&#39;结构如下:

<studentstoadd>
<OWNINST>555466|2</OWNINST>
<OWNINST>654321|1</OWNINST>
</studentstoadd>

对于File2.xml中的每个学生,我想更改他们的&#39; FC&#39; File1.xml中的节点到&#39; 2&#39;无论以前是什么。不应更改未列在File2.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="OWNINST">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:copy-of select="document('File2.xml')//Instance[OWNINST=current()/../OWNINST]"/>
    </xsl:copy>

</xsl:template>

1 个答案:

答案 0 :(得分:1)

我想你只想要

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


<xsl:template match="student/instance[OWNINST = document('File2.xml')/studentstoadd/OWNINST]/FC">
    <FC>2</FC>
</xsl:template>