3

同じ値を持つ可能性のある住所要素を含むソース XML があります (Contact/id=1 と Contact/id=3 は同じ住所であることに注意してください:

<?xml version="1.0" encoding="utf-8"?>
<Contacts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Contact>
        <id>1</id>
        <Address>
            <City City="Wien" />
            <Postcode Postcode="LSP-123" />
        </Address>
    </Contact>
    <Contact>
        <id>2</id>        
        <Address>
            <City City="Toronto" />
            <Postcode Postcode="LKT-947" />
        </Address>
    </Contact>
    <Contact>
        <id>3</id>        
        <Address>
            <City City="Wien" />
            <Postcode Postcode="LSP-123" />
        </Address>
    </Contact>
</Contacts> 

XSLT 1.0 での望ましい出力:

<?xml version="1.0" encoding="utf-8"?>
<Contacts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Contact>
        <id>1</id>
        <Address>SomeId_1</Address>
    </Contact>
    <Contact>
        <id>2</id>        
        <Address>SomeId_2</Address>
    </Contact>
    <Contact>
        <id>3</id>        
        <Address>SomeId_1</Address>
    </Contact>
</Contacts>

関数 generate-id(Address) を使用すると、連絡先 1 と連絡先 3 のアドレスに異なる ID を取得しました。その値のみに基づいてノードの一意の ID を生成する他の方法はありますか?

お手伝いありがとう。

4

2 に答える 2

1

XSLT の generate-id() は、@xml:id を生成することを目的としています。これは通常、ドキュメント内のノードを一意に識別するための属性です。したがって、generate-id() を呼び出すたびに、一意の値を取得する必要があります。

生成したい識別子は単なるデータであり、generate-id() が行うこととは何の関係もありません。

値が他のデータの値に基づいている識別子が必要な場合は、そのデータから生成する必要があります。これらの値を連結します。次に例を示します。

<?xml version="1.0" encoding="UTF-8"?>

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

<xsl:template match="Address">
    <Address>
        <xsl:value-of select="concat(City/@City, '+', Postcode/@Postcode)"/>
    </Address>
</xsl:template>

生産します:

    <?xml version="1.0" encoding="UTF-8"?>
<Contacts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Contact>
        <id>1</id>
        <Address>Wien+LSP-123</Address>
    </Contact>
    <Contact>
        <id>2</id>        
        <Address>Toronto+LKT-947</Address>
    </Contact>
    <Contact>
        <id>3</id>        
        <Address>Wien+LSP-123</Address>
    </Contact>
</Contacts>

識別子に他の要件がある場合は、関数を作成するか、ルックアップ テーブルを使用して、それらのキーから他の識別子にマップできます。

于 2013-08-10T19:52:57.953 に答える