Pengurutan XSLT bersama dengan saudara sebelumnya ::

Dalam loop foreach saya ingin menggunakan saudara sebelumnya::

<for-each..>
    <xsl:sort select="type"/>
    <xsl:when test="preceding-sibling::data[1]/type != type

masalahnya adalah "tipe" dalam foreach dibandingkan dengan saudara sebelumnya yang tidak diurutkan, mis.

data1/type = 1 
data2/type = 2
data3/type = 1

akan membandingkan di loop kedua silbling=2 (asli tidak disortir) dan type=1 (karena diurutkan)

apakah ada jalan keluarnya?

PEMBARUAN: niat saya adalah sebagai berikut

before             after
data/type2         type1 value1
data/type1         type1 value2 
data/type1         and speaking in HTML a spacer here (I compare type2:value to preceding-sibling value
data/type2         type2 value1
                   type2 value2

Saya memiliki daftar alamat yang tidak diurutkan dengan tipe kota dan saya memerlukan Tabel HTML yang diurutkan berdasarkan kota dan untuk melakukan beberapa hal tergantung pada nilai dan bidang lainnya (bagian itu berfungsi, tetapi karena perbandingan dengan saudara sebelumnya tidak bekerja di diurutkan untuk masing-masing, saya mendapat masalah


person RRZ Europe    schedule 12.05.2011    source sumber


Jawaban (4)


Apakah Anda mencoba mengelompokkan elemen data berdasarkan jenisnya? Beri tahu kami apa yang Anda coba lakukan dan kami mungkin dapat membantu (seperti yang dikatakan @Michael Kay).

Salah satu opsi (di XSLT 2.0 atau dengan ekstensi kumpulan simpul) adalah mengurutkan-menyalin elemen data ke variabel baru, lalu menjalankan xsl:for-each Anda pada kumpulan simpul di variabel baru tersebut. Kemudian hubungan saudara sebelumnya akan mencerminkan urutan yang diurutkan.

person LarsH    schedule 12.05.2011
comment
Saya ingin mengurutkan node berdasarkan data/tipe dan menggunakannya setelahnya. Bagaimana cara saya membuat salinan simpul itu yang diurutkan? - person RRZ Europe; 13.05.2011

Solusi ini sekarang berfungsi untuk saya:

    <xsl:variable name="sortedcopy">
      <xsl:for-each select="node1/node2/node3/data">
        <xsl:sort select="type" order="ascending"/>
        <xsl:copy-of select="current()"/>
      </xsl:for-each>
    </xsl:variable>
    <xsl:variable name="relItems" select="MSXML:node-set($sortedcopy)" />
    <xsl:for-each select="$relItems/data">
      <xsl:if test="not(preceding-sibling::data[1]/id = id)">
        <hr/>
      </xsl:if>
      <xsl:value-of select="val"/>
    </xsl:for-each>
person RRZ Europe    schedule 13.05.2011
comment
Senang sarannya membantu. Menurut saya, seperti yang ditunjukkan oleh masing-masing penjawab, Anda akan mendapatkan kinerja yang lebih baik jika menggunakan fitur pengelompokan yang direkomendasikan, seperti Meunchian. - person LarsH; 14.05.2011
comment
node-set() adalah merupakan fungsi kepemilikan dan bukan bagian dari standar XSL 1.0, jadi ini tidak akan terjadi portabel. - person vallismortis; 02.10.2015

Hubungan node satu sama lain - orang tua, anak, saudara kandung, dll, tidak diubah dengan pengurutan. Anda dapat melihat karyawan berdasarkan urutan tanggal lahir, namun mereka masih memiliki orang tua, anak, dan saudara kandung yang sama seperti di pohon aslinya - karena mereka masih merupakan simpul di pohon aslinya.

Jadi Anda sudah mengatakan bagaimana Anda ingin menyelesaikan masalah Anda, dan itu tidak akan berhasil. Langkah selanjutnya adalah memberi tahu kami apa masalahnya.

person Michael Kay    schedule 12.05.2011
comment
Ini tidak memberikan jawaban atas pertanyaan tersebut. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah postingan mereka. - person Dijkgraaf; 05.10.2015
comment
Saya akan mengklaim bahwa pertanyaan Anda tidak koheren dan inilah alasannya. Ini bukan solusi untuk masalah OP, tapi jawaban atas pertanyaan mereka. - person Michael Kay; 05.10.2015
comment
Jika orang lain, seperti saya, berakhir di sini melalui Google, Michael Kay memberikan jawaban untuk pertanyaan serupa di sini. - person J. Roovers; 03.06.2021

Karena XSLT menjamin bahwa elemen dengan kunci pengurutan yang sama akan muncul dalam urutan dokumen, Anda dapat menggantinya

<xsl:when test="preceding-sibling::data[1]/type != type">

dengan

<xsl:when test="not(preceding::data/type = type)">

untuk memeriksa apakah node saat ini adalah node pertama dalam dokumen (dan karenanya, dalam kumpulan yang diurutkan) dengan tipenya. (Perhatikan bahwa saya menggunakan preceding bukannya preceding-sibling, karena saya tidak tahu apakah semua elemen data Anda akan bersaudara dalam dokumen asli.)

Jika kinerja menjadi masalah, Anda juga dapat menggunakan xsl:key. Solusi lain adalah pengelompokan (menggunakan pengelompokan Muenchian di XSLT 1.0 dan xsl:for-each-group di XSLT 2.0).

person markusk    schedule 13.05.2011
comment
Penggantinya tidak berhasil untuk saya. Grup pertama dihasilkan seperti yang diharapkan (<group><data type="type1" value="v1"/><data type="type1" value="v2"/></group>) tetapi grup lainnya diduplikasi (<group><data type="type2" value="v1"/></group> <group><data type="type2" value="v2"/></group> bukannya <group><data type="type2" value="v1"/><data type="type2" value="v2"/></group> yang diharapkan). - person Julien Kronegg; 26.06.2013