2009-07-02 15 views
3

私はXSLT初心者です。私は1つのXMLフォーマットを別のものに変換しようとしています。XSLT:固有の属性値を抽出する

一意の属性値を抽出し、値を新しい形式に変換する必要があります。下のサンプルXMLは、元の形式と新しい/目的の形式を示しています。

私は楽しむことなくこれをやろうと努力してきました。誰でも手伝ったり、私に指針を与えたりできますか?

オリジナルフォーマット:

<base> 
    <level> 
    <level2 Name ="AA" value="1"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="2"/> 
    </level> 
    <level> 
    <level2 Name ="BB" value="3"/> 
    </level> 
    <level> 
    <level2 Name ="CC" value="4"/> 
    </level> 
    <level> 
    <level2 Name ="AA" value="5"/> 
    </level> 
</base> 

新フォーマット:

<base> 
    <levelNames> 
    <level level2Name ="AA"/> 
    <level level2Name ="BB"/> 
    <level level2Name ="CC"/> 
    </levelNames> 
</base> 

どうもありがとうございました。

+1

これまでに試したことがあるXSLTを投稿し、提案をします – skaffman

答えて

2

もう一度Muenchian grouping techniqueが欠けているように見えます。

これはかなり問題ではありませんので、私はMuenchと握手するためにあなた自身の仕事をさせていただきます。

+0

これを投票して移動し、解決策を投稿して、それについて罪悪感を感じることには矛盾しています。いまいましい。 :-Dしかし、あなたはおそらくこれが宿題であると疑っているので、私は控える。 – Tomalak

+0

これを一度やったことがあれば、それが本当にいかに簡単かを知ることができます。あなたはちょうどアイデアを取得する必要があります。最も一般的なXSLTの問題については、まず最初に見てみることをお勧めします:http://www.dpawson.co.uk/xsl/sect2/sect21.html – Boldewyn

+1

私の計画が成功しました! annakata

0

最初のxsl:keyを作成してください。これで、以下のコードを簡単に使用できます。

のxsl:キー名= "levelName" 一致= "LEVEL2" 使用=

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

<xsl:template match="base"> 
    <xsl:element name="{local-name(.)}"> 
     <xsl:element name="levelNames"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:element> 
</xsl:template> 

    <xsl:template match="level"> 
     <xsl:for-each select="level2[count(.|key('levelName', @Name)[1]) = 1]"> 
      <xsl:sort order="ascending" data-type="text" select="@Name"/> 
      <xsl:element name="{local-name(..)}"> 
       <xsl:attribute name="level2Name"> 
        <xsl:value-of select="@Name"/> 
       </xsl:attribute> 
      </xsl:element> 
     </xsl:for-each> 
    </xsl:template> 
9

XSLT SOLN "名前@":

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:key name="LevelDistint" match="level2" use="@Name"/> 
    <xsl:template match="base"> 
     <base> 
      <levelNames> 
       <xsl:for-each select="level/level2[generate-id() = generate-id(key('LevelDistint', @Name)[1])]"> 
        <level> 
         <xsl:attribute name="level2Name"><xsl:value-of select="normalize-space(@Name)"/></xsl:attribute> 
        </level> 
       </xsl:for-each> 
      </levelNames> 
     </base> 
    </xsl:template> 
</xsl:stylesheet> 

XSLTのO/P:

<?xml version="1.0" encoding="UTF-8"?> 
<base> 
    <levelNames> 
     <level level2Name="AA"/> 
     <level level2Name="BB"/> 
     <level level2Name="CC"/> 
    </levelNames> 
</base>