0

xmi ファイルに次の要素があります。

<element1 id= 3 >

<element2 id= 3>

私はそれらを次のようなものに変換したい:

<element1 id= 3 name =element2>
<element2 id= 3>

xslt を使用して変換しています:

<xsl:if test="@id = //*[@id]/@id">
                <xsl:sequence
                    select="fn:createAtt('name',X)" />
            </xsl:if>

2 つの要素の ID を比較したいのですが、それらが一致する場合は、2 番目の要素 (element2) の名前を最初の要素の name 属性に保存したいと考えています。

比較は正常に機能します。問題は、2 番目の要素の名前の読み方です。name() 関数を使用しようとしましたが、比較に一致する名前を正確に読み取ることができません。

4

1 に答える 1

0

私はこのようにします:最初にキーを次のように定義します

<xsl:key name="el-by-id" match="*" use="@id"/>

それから私はテンプレートを書きます

<xsl:template match="*[@id]">
  <xsl:variable name="same-id" use="key('el-by-id', @id) except ."/>
  <xsl:copy>
     <xsl:copy-of select="@*"/>
     <xsl:if test="$same-id">
       <xsl:attribute name="name" select="node-name($same-id[1])"/>
     </xsl:if>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

このようにして、キーを使用して要素を効率的に参照できます。同じIDの要素が1つ見つかった場合は、という名前の属性nameが作成されます。node-name代わりに使用したい正確な要件に応じて、XSLT /XPath2.0関数を使用<xsl:attribute name="name" select="name($same-id[1])"/>しました。

于 2012-08-06T10:20:48.677 に答える