2017-11-26 37 views
0

このブロックを削除したり、対処したりすることによって、このブロックを別のものに変換する必要があります。別のブロックから別のブロックを属性として追加してブロックを削除する

この出力の中へ
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output> 
    <cars> 
     <car> 
      <id>1</id> 
      <brand>Audi</brand> 
      <type>A3</type> 
      <license>B-01-TST</license> 
     </car> 
     <car> 
      <id>2</id> 
      <brand>Volkwagen</brand> 
      <type>Golf</type> 
      <license>IF-02-TST</license> 
     </car> 
    </cars> 
    <distances> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110901</date> 
      <distance>111</distance> 
     </distance> 
     <distance> 
      <id_car>1</id_car> 
      <date>20110902</date> 
      <distance>23</distance> 
     </distance> 
     <id_car>2</id_car> 
      <date>20110901</date> 
      <distance>92</distance> 
     </distance> 
     <distance> 
      <id_car>2</id_car> 
      <date>20110902</date> 
      <distance>87</distance> 
     </distance> 
    </distances> 
</output> 

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<output> 
<cars> 
<car> 
    <id>1</id> 
    <brand>Audi</brand> 
    <type>A3</type> 
    <license>B-01-TST</license> 
    <distances> 
    <distance day="20110901">111</distance> 
    <distance day="20110902">23</distance> 
    </distances> 
</car> 
<car> 
    <id>2</id> 
    <brand>Volkwagen</brand> 
    <type>Golf</type> 
    <license>IF-02-TST</license> 
    <distances> 
    <distance day="20110901">92</distance> 
    <distance day="20110902">87</distance> 
    </distances> 
</car> 
</cars> 
</output> 

今では私だけの距離ブロックを削除し、正しい場所にそれを追加することができましたが、どのように私は車/ ID主催の距離を得ることができますし、日付のタグを属性の日として距離に追加しますか?ここで は、私がこれまで何をやったかである:

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

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

<xsl:template match="distances" /> 

<xsl:template match="license"> 
    <xsl:copy-of select="."/> 
    <distances></distances> 
</xsl:template> 

</xsl:stylesheet> 

答えて

1

は、相互参照を追跡し、それら参照される要素を変換するためのテンプレートを書くために、キーを使用します。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

    <xsl:key name="dist" match="distances/distance" use="id_car"/> 

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

    <xsl:template match="distances" /> 

    <xsl:template match="license"> 
     <xsl:next-match/> 
     <distances> 
      <xsl:apply-templates select="key('dist', ../id)"/> 
     </distances> 
    </xsl:template> 

    <xsl:template match="distance"> 
     <distance day="{date}"> 
      <xsl:value-of select="distance"/> 
     </distance> 
    </xsl:template> 

</xsl:transform> 

http://xsltransform.net/a9GixV

+0

感謝それは働いている人!これは、あなたがid_carでcar/car/idと一致するkey distを使用していることを意味しますか?いいえ、私はちょうど 'select =" key( 'dist'、../id) – orosco03

+0

鍵を使ったことはありますか?キーの宣言は、XSLTプロセッサに 'distance'要素の' distance'子要素のインデックスを '' xsl:key name = "dist" match = "distance/distance" use = "id_car" id_car'値を取得し、 'key'関数を使用してそのような値で' distance'を見つけることができます。 'license'テンプレートの中で、私たちが使用したい' id'は 'key( 'dist'、../id)'を呼び出すために必要な親 'car'の一部です。 –

+0

私はちょうどXSLを勉強しています、私は前にキーを使用していなかったので、それは非常に有用だった、ありがとう男! – orosco03

関連する問題