XSLT: mengekstraksi nilai atribut unik

Tolong bantu, saya seorang pemula XSLT dan saya mencoba mengubah satu format XML ke format lainnya.

Saya perlu mengekstrak nilai atribut unik dan mengubah nilainya ke dalam format baru. Contoh XML di bawah ini menunjukkan format asli dan baru/target.

Saya telah menghabiskan waktu lama mencoba melakukan ini tanpa kesenangan apa pun. Adakah yang bisa membantu atau memberi saya beberapa petunjuk?

Format asli:

<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>

Format baru:

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

Terima kasih banyak.


person SuperSuperDev1234    schedule 02.07.2009    source sumber
comment
Posting XSLT apa yang telah Anda coba sejauh ini, dan kami akan memberikan saran   -  person skaffman    schedule 02.07.2009


Jawaban (3)


Solusi XSLT:

<?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>

O/P XSLT:

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

Sekali lagi teknik pengelompokan Muenchian tampaknya merupakan bagian yang hilang.

Masalah yang cukup sepele, jadi saya akan membiarkan Anda melakukan pekerjaan Anda sendiri untuk memahami Muench.

person annakata    schedule 02.07.2009
comment
Saya merasa ambivalen antara memilih hal ini dan melanjutkan serta memposting solusi dan merasa bersalah karenanya. Kurang ajar kau. :-D Tapi Anda mungkin benar dalam mencurigai bahwa ini adalah pekerjaan rumah, jadi saya menahan diri. - person Tomalak; 02.07.2009
comment
Jika Anda pernah melakukannya sekali, Anda akan melihat betapa mudahnya melakukannya. Anda hanya perlu mendapatkan idenya. Untuk sebagian besar masalah XSLT yang umum, saya sarankan untuk melihat terlebih dahulu di sini: dpawson.co .uk/xsl/sect2/sect21.html - person Boldewyn; 02.07.2009
comment
@Boldewyn - ya itu sumber yang bagus untuk pemula, meskipun tidak enak dilihat :) - person annakata; 02.07.2009
comment
sigh adakah yang mau menjelaskan suara negatifnya? Apakah karena saya tidak mengerjakan pekerjaan OP untuknya? - person annakata; 03.07.2009

Silakan buat xsl:key terlebih dahulu lalu Anda dapat menggunakan kode di bawah ini dengan mudah.

xsl: nama kunci = "nama level" cocok = "level2" gunakan = "@Nama"

<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>
person Community    schedule 02.07.2009