0

良い一日!

私は次のことを行うxsl変換ファイルを作成しようとしています:

特性タイプの子要素が多数ある要素があります。それぞれに固有の名前があります。一部の名前と特定の名前付き特性セット(データセットと呼ばれる)の間の論理接続を説明するリストもあります。

CharacteristicName:DatasetName
----------------
Att1_DS1:DS1
Att2_DS1:DS1
Att1_DS2:DS2
Att2_DS2:DS2

メイン要素がタイプの新しい要素を取得するように、xmlを変換する必要があります<Dataset>。リストされた特性名がソースドキュメントに表示されている場合は、テーブルのIDを持つこれらのデータセットが表示されます。次に、対応する特性がこれらのデータセット要素にコピーされます/

一部の特性名がテーブルにリストされていない場合は、IDが「その他」のデータセットに配置する必要があります。

ソースXML:

<Object>
    <ID>Obj1</ID>

    <!--DS1-->     
    <Characteristic>
        <Name>Att1_DS1</Name>
        <Value>25</Value>
    </Characteristic>

    <!--DS2-->
    <Characteristic>
        <Name>Att1_DS2</Name>
        <Value>25</Value>
    </Characteristic>

    <!--DS1-->  
    <Characteristic>
        <Name>Att2_DS1</Name>
        <Value>ABC</Value>
    </Characteristic>       

    <!--DS2-->
    <Characteristic>
        <Name>Att2_DS2</Name>
        <Value>ABC</Value>
    </Characteristic>   

            <!--Other-->
    <Characteristic>
        <Name>Att3_NN</Name>
        <Value>25</Value>
    </Characteristic>   

</Object>

次のように変換する必要があります。

<Object>
    <ID>Obj1</ID>

    <Dataset id="DS1">
        <Characteristic>
            <Name>Att1_DS1</Name>
            <Value>25</Value>
        </Characteristic>
        <Characteristic>
            <Name>Att2_DS1</Name>
            <Value>ABC</Value>
        </Characteristic>
    </Dataset>

    <Dataset id="DS2">
        <Characteristic>
            <Name>Att1_DS1</Name>
            <Value>25</Value>
        </Characteristic>
        <Characteristic>
            <Name>Att2_DS1</Name>
            <Value>ABC</Value>
        </Characteristic>
    </Dataset>

    <Dataset id="Other">
        <Characteristic>
            <Name>Att3_NN</Name>
            <Value>25</Value>
        </Characteristic>
    </Dataset>

</Object>

これらを行うのを手伝っていただけませんか。どの方向に進むべきかについてのヒントやアイデアはありますか?

4

1 に答える 1

0

この変換

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

      <my:datasets>
       <ds>
         <id>DS1</id>
         <n>Att1_DS1</n>
         <n>Att2_DS1</n>
       </ds>
       <ds>
         <id>DS2</id>
         <n>Att1_DS2</n>
         <n>Att2_DS2</n>
       </ds>
       <ds>
         <id>other</id>
         <n>Att3_NN</n>
       </ds>
      </my:datasets>

      <xsl:variable name="vDS" select="document('')/*/my:datasets/*"/>

      <xsl:template match="/*">
       <Object>
         <xsl:copy-of select="ID"/>

         <xsl:apply-templates select=
            "$vDS[n = current()/Characteristic/Name]">
          <xsl:with-param name="pChars" select="Characteristic"/>
         </xsl:apply-templates>
       </Object>
      </xsl:template>

      <xsl:template match="ds">
       <xsl:param name="pChars"/>
        <Dataset id="{id}">
         <xsl:copy-of select="$pChars[Name = current()/n]"/>
        </Dataset>
      </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合

<Object>
    <ID>Obj1</ID>

    <Characteristic>
        <Name>Att1_DS1</Name>
        <Value>25</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att1_DS2</Name>
        <Value>25</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att2_DS1</Name>
        <Value>ABC</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att2_DS2</Name>
        <Value>ABC</Value>
    </Characteristic>

    <Characteristic>
        <Name>Att3_NN</Name>
        <Value>25</Value>
    </Characteristic>
</Object>

必要な正しい結果を生成します

<Object>
   <ID>Obj1</ID>
   <Dataset id="DS1">
      <Characteristic>
         <Name>Att1_DS1</Name>
         <Value>25</Value>
      </Characteristic>
      <Characteristic>
         <Name>Att2_DS1</Name>
         <Value>ABC</Value>
      </Characteristic>
   </Dataset>
   <Dataset id="DS2">
      <Characteristic>
         <Name>Att1_DS2</Name>
         <Value>25</Value>
      </Characteristic>
      <Characteristic>
         <Name>Att2_DS2</Name>
         <Value>ABC</Value>
      </Characteristic>
   </Dataset>
   <Dataset id="other">
      <Characteristic>
         <Name>Att3_NN</Name>
         <Value>25</Value>
      </Characteristic>
   </Dataset>
</Object>
于 2012-06-01T13:13:07.977 に答える