3

私はxsltを初めて使用しますplsは、属性値に基づいて2つのノードを比較するxsltを提供します。

入力.xml:

<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
 </alink>
<bibsection>
<bib id="0001">2007</bib>
 <bib id="0002">2008</bib>
<bib id="0003">2009</bib>
 </bibsection>
 </comp>

私の出力は、

output.xml:

<comp>
<alink>
 <link id="0003"/><year>2009</year>
 <link id="0001"/><year>2007</year>
 <link id="0002"/><year>2008</year>
  </alink>
 <bibsection>
<bib id="0001">2007</bib>
 <bib id="0002">2008</bib>
 <bib id="0003">2009</bib>
  </bibsection>
  </comp>

前もって感謝します。

4

1 に答える 1

1

keys を使用した完全で効率的な短い変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kBibById" match="bib" use="@id"/>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="link">
  <xsl:call-template name="identity"/>
  <year><xsl:value-of select="key('kBibById', @id)"/></year>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<comp>
    <alink>
        <link id="0003"/>
        <link id="0001"/>
        <link id="0002"/>
    </alink>
    <bibsection>
        <bib id="0001">2007</bib>
        <bib id="0002">2008</bib>
        <bib id="0003">2009</bib>
    </bibsection>
</comp>

必要な正しい結果が生成されます。

<comp>
   <alink>
      <link id="0003"/>
      <year>2009</year>
      <link id="0001"/>
      <year>2007</year>
      <link id="0002"/>
      <year>2008</year>
   </alink>
   <bibsection>
      <bib id="0001">2007</bib>
      <bib id="0002">2008</bib>
      <bib id="0003">2009</bib>
   </bibsection>
</comp>

説明:

  1. ID ルールは、一致したすべてのノードを「そのまま」コピーします。

  2. ID テンプレートをオーバーライドする単一のテンプレートがあり、それはあらゆるlink要素に一致します。このテンプレートの本文のコードは、ID テンプレートを名前で呼び出して一致した要素を処理し、属性が の属性と同じ値を持つ最初の要素の文字列値を値とするテキスト ノードの子を使用して要素linkを構築します。マッチした要素。この要素の選択は、「kBibById」という名前の命令を参照する関数を使用して行われます。yearbibididlinkbibkey()xsl:key

注意:

上記のアイデンティティ ルールへのリンクは一時的に機能しません。しばらくの間、インターネット アーカイブから次のいずれかを使用してください。

http://web.archive.org/web/20081229160200/http://www.dpawson.co.uk/xsl/sect2/identity.html

于 2012-07-04T14:46:25.273 に答える