วิธีการค้นหาย้อนกลับการเกิดขึ้นครั้งสุดท้ายของอักขระในสตริงโดยใช้ XSLT

การค้นหาตัวอักษรเฉพาะในสตริงสามารถเป็นงานที่เกิดขึ้นบ่อยในโปรแกรมมิ่ง โดยเฉพาะอย่างยิ่งเมื่อจัดการกับ URLs หรือเส้นทางไฟล์ ใน XSLT ขณะที่มีฟังก์ชันในการค้นหาการเกิดขึ้นครั้งแรกของอักขระ เราอาจต้องดึงการเกิดขึ้นครั้งสุดท้ายของอักขระ โดยเฉพาะเมื่อทำการสกัดชื่อไฟล์และนามสกุล โพสต์บล็อกนี้เสนอวิธีแก้ปัญหาสำหรับปัญหาที่พบได้ทั่วไป: วิธีการค้นหาย้อนกลับอักขระในสตริงและดึงข้อมูลที่มีความหมาย

ความท้าทาย: การสกัดนามสกุลไฟล์

ลองพิจารณาตัวอย่างนี้:

<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>

โดยใช้ฟังก์ชันพื้นฐานใน XSLT เช่น substring-before() และ substring-after() เราสามารถระบุตำแหน่งการเกิดขึ้นครั้งแรกของจุด (.) ใน URL ไฟล์ได้ง่ายดาย อย่างไรก็ตาม เพื่อดึงชื่อไฟล์และนามสกุลของมัน เราจำเป็นต้องระบุตำแหน่งจุดสุดท้ายภายในสตริง ซึ่งเป็นการดำเนินการที่ไม่ง่ายนักด้วยฟังก์ชันมาตรฐาน

ทำไมเราจึงต้องการการเกิดขึ้นครั้งสุดท้าย?

เป้าหมายคือการแยกชื่อไฟล์ออกจากนามสกุลของมัน ตัวอย่างเช่น จาก URL ข้างต้น เราต้องการสกัด:

  • ชื่อไฟล์: media
  • นามสกุลไฟล์: jpg

เพื่อบรรลุสิ่งนี้ เราจำเป็นต้องมีวิธีในการระบุตำแหน่ง . ครั้งสุดท้ายในสตริงอย่างมีประสิทธิภาพ

วิธีแก้ปัญหา: แบบตัวอย่าง XSLT แบบกำหนดเอง

นี่คือวิธีที่ง่ายและมีประสิทธิภาพในการค้นหาการเกิดขึ้นครั้งสุดท้ายของอักขระในสตริงโดยใช้ XSLT 1.0 วิธีการนี้เกี่ยวข้องกับการสร้างเทมเพลตที่ทำงานซ้ำที่ประมวลผลสตริงและดึงส่วนที่ต้องการ

การใช้งานโค้ด XSLT

นี่คือตัวอย่างเทมเพลตที่บรรลุเป้าหมายนี้:

<xsl:template name="getExtension">
  <xsl:param name="filename"/>
  
  <xsl:choose>
    <xsl:when test="contains($filename, '.')">
      <xsl:call-template name="getExtension">
        <xsl:with-param name="filename" select="substring-after($filename, '.')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$filename"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="/">
  <xsl:call-template name="getExtension">
    <xsl:with-param name="filename" select="'http://www.blah.com/path/to/file/media.jpg'"/>
  </xsl:call-template>
</xsl:template>

คำอธิบายของโค้ด

  • การประกาศเทมเพลต: เทมเพลต getExtension ถูกออกแบบมาเพื่อดึงนามสกุลไฟล์จากชื่อไฟล์ทั้งหมด

  • พารามิเตอร์: มันรับพารามิเตอร์ $filename ซึ่งถือสตริงที่จะประมวลผล

  • ตรรกะเงื่อนไข:

    • ถ้าชื่อไฟล์มีจุด มันจะเรียกตัวเองซ้ำซึ่งส่งต่อสตริงย่อยที่อยู่หลังจุดแรก
    • สิ่งนี้จะดำเนินต่อไปจนกว่าจะถึงสตริงย่อยสุดท้าย (นามสกุลจริง) ซึ่งจะถูกพิมพ์ออกมาเป็นผลลัพธ์
  • การจับคู่เทมเพลตราก: เทมเพลตหลักจะจับคู่ที่รากและเริ่มต้นการเรียกไปยัง getExtension โดยจัดเตรียม URL ซึ่งเรากำลังดึงนามสกุลจาก

วิธีการใช้งาน

เพื่อใช้ XSLT ข้างต้นในโปรเจ็กต์ของคุณ:

  1. แทรกโค้ดนี้ลงในสไตล์ชีต XSLT ของคุณ
  2. ปรับปรุง URL หรือเส้นทางในคำสั่ง select ภายในเทมเพลตรากตามต้องการ
  3. ประมวลผลข้อมูล XML ของคุณเพื่อดึงนามสกุลไฟล์ได้อย่างลื่นไหล!

ข้อคิดสุดท้าย

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

อย่าลืมอ้างอิงคู่มือนี้เมื่อใดก็ตามที่คุณต้องเผชิญกับความท้าทายในการประมวลผลสตริงที่คล้ายกันใน XSLT!