从一个文件到另一个文件查找并替换XML属性值

从一个文件到另一个文件查找并替换XML属性值,xml,xslt,Xml,Xslt,我有两个XML文件,其中包含关于相同项目的数据,保存在客户端和服务器上。与服务器相比,客户端上的某些数据相同,某些属性/子元素不同 客户端数据如下所示(具有更多与比较无关的属性): 感谢您提供的任何帮助在将XSLT应用于server.xml时,您可以使用此处的document函数从第二个文档(在您的示例中为“client.xml”)中查找信息 例如,您可以定义一个变量,如,以包含client.xml中的所有项元素 <xsl:variable name="client" select="do

我有两个XML文件,其中包含关于相同项目的数据,保存在客户端和服务器上。与服务器相比,客户端上的某些数据相同,某些属性/子元素不同

客户端数据如下所示(具有更多与比较无关的属性):


感谢您提供的任何帮助

在将XSLT应用于server.xml时,您可以使用此处的document函数从第二个文档(在您的示例中为“client.xml”)中查找信息

例如,您可以定义一个变量,如,以包含client.xml中的所有元素

<xsl:variable name="client" select="document('client.xml')//item" />

然后,要替换server.xml中的@name属性,您可以创建一个模板来匹配属性,并从client.xml输出值

<xsl:template match="item/@name">
    <xsl:attribute name="name">
        <xsl:value-of select="$client[@id=current()/../@id]/@name" />
    </xsl:attribute>
</xsl:template>

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="clientXml" select="'client.xml'" />

    <xsl:variable name="client" select="document($clientXml)//item" />

    <xsl:template match="item/@name">
        <xsl:attribute name="name">
            <xsl:value-of select="$client[@id=current()/../@id]/@name" />
        </xsl:attribute>
    </xsl:template>

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

当应用于示例client.xml和server.xml文档时,将输出以下内容

<item type="4" id="1" name="Correct_Name"></item>

请注意,我已经参数化了“client.xml”文档的名称,因为这将允许您在需要时对不同名称的文档使用XSLT。您只需将第二个XML文件的名称作为参数传递

<xsl:template match="item/@name">
    <xsl:attribute name="name">
        <xsl:value-of select="$client[@id=current()/../@id]/@name" />
    </xsl:attribute>
</xsl:template>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="clientXml" select="'client.xml'" />

    <xsl:variable name="client" select="document($clientXml)//item" />

    <xsl:template match="item/@name">
        <xsl:attribute name="name">
            <xsl:value-of select="$client[@id=current()/../@id]/@name" />
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
<item type="4" id="1" name="Correct_Name"></item>