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