-1

これを説明するための適切なドキュメントを探していましたが、成功しませんでした。これは私の問題です:

これが私の要件です

  • ルート要素は名前を変更する必要があります (これは完了しています)。
  • 要素は、新しい要素に変換する必要があります。
  • 第 2 レベルの要素とその残りの属性を削除する必要があります
  • 第 3 レベル要素 (第 2 レベル要素内) のすべての属性は、第 2 レベル要素に変換されます。
  • 第 3 レベルの要素を削除する必要があります。

現時点の

<list>

<type name="drum" acustic="true" pieces="5" >
    <part name="pearl" id="0" version="0" displayOrder="0" customizationLevel="basic" />
    <part name="dw" id="1" version="0" displayOrder="0" customizationLevel="basic" />
</type>

<type name="guitar" acustic="true" pieces="1" >
    <part name="fender" id="0" version="0" displayOrder="0" customizationLevel="basic" />       
</type>

希望

<instrumentList>
    <instrument>
    <instrumentType>drum</instrumentType>
    <instrumentID>0</instrumentID>
    <instrumentBrand>pearl</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>

    <intrument>
    <instrumentType>drum</instrumentType>
    <instrumentID>1</instrumentID>
    <instrumentBrand>dw</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>
    <instrument>    
    <instrumentType>guitar</instrumentType>
    <instrumentID>0</instrumentID>
    <instrumentBrand>fender</instrumentBrand>
    <version>0</version>
    <displayOrder>0</displayOrder>
    <customizationLevel>basic</customizationLevel>
    </instrument>
</instrumentList>

だから私は成功せずに次のチュートリアルとスレッドに従いました スレッド 1 スレッド 2

一部はできますが、全部はできません。ここで、特に要素を削除して新しい要素を作成し、すべてではなくいくつかの属性を使用して、私が理解していないことがあると確信しています。xslt が xml をどのように解析するかを理解できる良いリファレンスを誰かが教えてくれたとしても、私が見つけたすべての例はすべての属性または要素を変換するため、残念ながら私の場合ではありません。

どんな助けでも大歓迎です

4

1 に答える 1

1

さて、次のように、属性を要素に変換する汎用テンプレートを作成することから始めます。

<xsl:template match="@*">
   <xsl:element name="{local-name()}">
      <xsl:value-of select="."/>
   </xsl:element>
</xsl:template>

しかし、要件を見ると、特定の属性は要素として名前を変更する必要があるため、これらの特定のテンプレートを作成します。たとえば、@id要素はInstrumentIdという名前に変更されるようです

<xsl:template match="@id">
   <instrumentID>
      <xsl:value-of select="."/>
   </instrumentID>
</xsl:template>

part要素に一致するテンプレートで必要な追加作業は、親属性と等しい値を持つinstrumentType要素を出力する必要があることだけです。それとは別に、変換するすべてのアトリビュート エレメントを選択するだけで済みます

<xsl:template match="part">
   <instrumentType>
      <xsl:value-of select="../@name"/>
   </instrumentType>
   <xsl:apply-templates select="@*"/>
</xsl:template>

第 2 レベルのtype要素については、XSLT の組み込みテンプレートに処理させることができます。

このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="list">
      <instrument>
         <xsl:apply-templates/>
      </instrument>
   </xsl:template>

   <xsl:template match="part">
      <instrumentType>
         <xsl:value-of select="../@name"/>
      </instrumentType>
      <xsl:apply-templates select="@*"/>
   </xsl:template>

   <xsl:template match="@id">
      <instrumentID>
         <xsl:value-of select="."/>
      </instrumentID>
   </xsl:template>

   <xsl:template match="@name">
      <instrumentBrand>
         <xsl:value-of select="."/>
      </instrumentBrand>
   </xsl:template>

   <xsl:template match="@*">
      <xsl:element name="{local-name()}">
         <xsl:value-of select="."/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

XML に適用すると (終了リストタグを想定)、次のように出力されます。

<instrument>
   <instrumentType>drum</instrumentType>
   <instrumentBrand>pearl</instrumentBrand>
   <instrumentID>0</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>

   <instrumentType>drum</instrumentType>
   <instrumentBrand>dw</instrumentBrand>
   <instrumentID>1</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>

   <instrumentType>guitar</instrumentType>
   <instrumentBrand>fender</instrumentBrand>
   <instrumentID>0</instrumentID>
   <version>0</version>
   <displayOrder>0</displayOrder>
   <customizationLevel>basic</customizationLevel>
</instrument>
于 2013-05-31T22:51:27.507 に答える