查找XML属性值并将其替换为另一个文件

时间:2012-12-04 03:20:21

标签: xml xslt

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

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

<item id="1" create_dttm="05/28/2010 12:00:00 AM" name="Correct_Name">
        <text1>sample</text1>
        <icon>iconurl</icon>        
</item>

服务器数据看起来像这样(具有更多属性和可能的​​子元素):

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

因为项目的匹配是通过我们代码中的ID完成的,所以为server.xml进行数据输入的人对名称并不十分谨慎,只留下拼写错误或占位符名称。这不会导致错误,但我宁愿保持安全,并确保server.xml中的所有拼写错误的条目都被client.xml中的正确名称替换(这些是双重检查并且都是正确的)

是否可以运行一些脚本/代码/ xslt样式表来使用client.xml中的名称替换server.xml中的名称?

我对样式表不是很熟悉,也不确定从哪里开始编写类似的东西

基本上我希望它看起来像这样:

Read client.xml
Read server.xml

For each item in client.xml, read attributes "id" and "name"
find item with same "id" in server.xml
replace "name" in server.xml with value from client.xml for the item with that "id"

感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:2)

您可以在此处使用文档功能,在将XSLT应用于server.xml时从第二个文档(在您的情况下为'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文件的名称作为参数传递。

相关问题