วิธีการค้นหาย้อนกลับการเกิดขึ้นครั้งสุดท้ายของอักขระในสตริงโดยใช้ 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 ข้างต้นในโปรเจ็กต์ของคุณ:
- แทรกโค้ดนี้ลงในสไตล์ชีต XSLT ของคุณ
- ปรับปรุง URL หรือเส้นทางในคำสั่ง
select
ภายในเทมเพลตรากตามต้องการ - ประมวลผลข้อมูล XML ของคุณเพื่อดึงนามสกุลไฟล์ได้อย่างลื่นไหล!
ข้อคิดสุดท้าย
การค้นหาการเกิดขึ้นครั้งสุดท้ายของอักขระในสตริงภายในข้อจำกัดของ XSLT สามารถทำได้ด้วยความคิดสร้างสรรค์เล็กน้อย โดยการใช้เทมเพลตซ้ำ คุณสามารถแยกสตริงที่ซับซ้อนและดึงข้อมูลที่มีค่าเช่นชื่อไฟล์และนามสกุล ซึ่งช่วยเพิ่มประสิทธิภาพในการจัดการข้อมูลของคุณ
อย่าลืมอ้างอิงคู่มือนี้เมื่อใดก็ตามที่คุณต้องเผชิญกับความท้าทายในการประมวลผลสตริงที่คล้ายกันใน XSLT!