XSLT เรียงลำดับร่วมกับลำดับก่อนหน้า::

ภายใน foreach loop ฉันต้องการใช้ preceding-sibling::

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

ปัญหาคือว่า "ประเภท" ภายใน foreach ถูกเปรียบเทียบกับพี่น้องก่อนหน้าที่ไม่เรียงลำดับเช่น

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

จะเปรียบเทียบในวงที่สอง silbling=2 (ดั้งเดิมไม่เรียงลำดับ) และ type=1 (เนื่องจากถูกเรียงลำดับ)

มีวิธีแก้ไขไหม?

อัปเดต: ความตั้งใจของฉันมีดังต่อไปนี้

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

ฉันมีรายการที่อยู่ที่ไม่เรียงลำดับโดยที่ประเภทเป็นเมืองและฉันต้องการตาราง HTML จัดเรียงตามเมืองและทำบางสิ่งขึ้นอยู่กับค่าและฟิลด์อื่น ๆ (ส่วนนั้นใช้งานได้ แต่เนื่องจากการเปรียบเทียบกับพี่น้องก่อนหน้าไม่ได้ การทำงานแบบเรียงลำดับสำหรับแต่ละอัน ฉันพบปัญหา


person RRZ Europe    schedule 12.05.2011    source แหล่งที่มา


คำตอบ (4)


คุณกำลังพยายามจัดกลุ่มองค์ประกอบข้อมูลตามประเภทหรือไม่? แจ้งให้เราทราบว่าคุณกำลังพยายามทำอะไร และเราอาจช่วยได้ (ดังที่ @Michael Kay กล่าว)

ทางเลือกหนึ่ง (ใน XSLT 2.0 หรือด้วยส่วนขยายชุดโหนด) คือการเรียงลำดับและคัดลอกองค์ประกอบข้อมูลไปยังตัวแปรใหม่ จากนั้นรัน xsl:for-each บนชุดโหนดในตัวแปรใหม่นั้น จากนั้นความสัมพันธ์แบบพี่น้องก่อนหน้านี้จะสะท้อนถึงการเรียงลำดับ

person LarsH    schedule 12.05.2011
comment
ฉันต้องการจัดเรียงโหนดตามข้อมูล/ประเภทแล้วใช้ในภายหลัง ฉันจะสร้างสำเนาของโหนดนั้นได้อย่างไร - person RRZ Europe; 13.05.2011

โซลูชันนี้ใช้งานได้สำหรับฉันแล้ว:

    <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
ดีใจที่ข้อเสนอแนะช่วยได้ ฉันคิดว่าตามที่ผู้ตอบแต่ละคนระบุไว้ คุณจะมีประสิทธิภาพที่ดีขึ้นหากคุณใช้ฟีเจอร์การจัดกลุ่มที่แนะนำ เช่น Meunchian - person LarsH; 14.05.2011
comment
node-set() คือ ฟังก์ชั่นที่เป็นกรรมสิทธิ์และไม่ได้เป็นส่วนหนึ่งของ มาตรฐาน XSL 1.0 ดังนั้นสิ่งนี้จะไม่ แบบพกพา - person vallismortis; 02.10.2015

ความสัมพันธ์ของโหนดระหว่างกัน เช่น พ่อแม่ ลูก พี่น้อง ฯลฯ จะไม่เปลี่ยนแปลงโดยการเรียงลำดับ คุณสามารถดูพนักงานตามลำดับวันเดือนปีเกิดได้ แต่พวกเขายังคงมีพ่อแม่ ลูก และพี่น้องคนเดิมเหมือนกับที่พวกเขาทำในแผนผังดั้งเดิม - เนื่องจากยังคงเป็นโหนดในแผนผังดั้งเดิม

คุณได้บอกว่าคุณต้องการแก้ไขปัญหาอย่างไร แต่มันจะไม่ได้ผล ขั้นตอนต่อไปคือการบอกเราว่าปัญหาคืออะไร

person Michael Kay    schedule 12.05.2011
comment
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้เขียน โปรดแสดงความคิดเห็นไว้ใต้โพสต์ของพวกเขา - person Dijkgraaf; 05.10.2015
comment
ฉันจะอ้างว่าคำถามของคุณไม่สอดคล้องกันและนี่คือสาเหตุว่าทำไมจึงเป็นคำตอบ ไม่ใช่วิธีแก้ปัญหาของ OP แต่เป็นคำตอบสำหรับคำถามของพวกเขา - person Michael Kay; 05.10.2015
comment
หากใครเช่นฉัน มาอยู่ที่นี่ผ่าน Google Michael Kay ให้คำตอบสำหรับคำถามที่คล้ายกัน ที่นี่ - person J. Roovers; 03.06.2021

เนื่องจาก XSLT รับประกันว่าองค์ประกอบที่มีคีย์การเรียงลำดับเท่ากันจะปรากฏตามลำดับเอกสาร คุณจึงสามารถแทนที่ได้

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

กับ

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

เพื่อตรวจสอบว่าโหนดปัจจุบันเป็นโหนดแรกในเอกสาร (และดังนั้นจึงอยู่ในชุดที่เรียงลำดับ) ตามประเภทหรือไม่ (โปรดทราบว่าฉันใช้ preceding แทน preceding-sibling เนื่องจากฉันไม่รู้ว่าองค์ประกอบข้อมูลทั้งหมดของคุณจะเป็นพี่น้องกันในเอกสารต้นฉบับหรือไม่)

หากประสิทธิภาพเป็นปัญหา คุณสามารถใช้ xsl:key ได้เช่นกัน อีกวิธีหนึ่งคือการจัดกลุ่ม (โดยใช้การจัดกลุ่ม Muenchian ใน XSLT 1.0 และ xsl:for-each-group ใน XSLT 2.0)

person markusk    schedule 13.05.2011
comment
การทดแทนไม่ได้ผลสำหรับฉัน กลุ่มแรกถูกสร้างขึ้นตามที่คาดไว้ (<group><data type="type1" value="v1"/><data type="type1" value="v2"/></group>) แต่กลุ่มที่เหลือซ้ำกัน (<group><data type="type2" value="v1"/></group> <group><data type="type2" value="v2"/></group> แทนที่จะเป็น <group><data type="type2" value="v1"/><data type="type2" value="v2"/></group> ที่คาดไว้) - person Julien Kronegg; 26.06.2013