2

クライアントとサーバーに保持されている、同じアイテムに関するデータを含む 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 の正しい名前に置き換えられるようにすることをお勧めします (これらは二重にチェックされ、すべて正しいものです)。

script/code/xslt スタイルシートを実行して、server.xml の名前を client.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"

ご協力いただきありがとうございます。

4

1 に答える 1

2

ここでdocument関数を利用して、XSLT を server.xml に適用するときに 2 番目のドキュメント (この場合は「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 を使用できるようになります。2 番目の XML ファイルの名前をパラメーターとして渡すだけです。

于 2012-12-04T16:55:12.847 に答える