سؤال
أنا بحاجة إلى أن تكون قادرة على العثور على الماضي وقوع حرف داخل عنصر.
على سبيل المثال:
<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>
إذا كنت تحاول العثور عليه من خلال استخدام substring-before(mediaurl, '.')
و substring-after(mediaurl, '.')
بعد ذلك سوف بالطبع المباراة على أول نقطة.
كيف يمكنني الحصول على ملف التمديد ؟ أساسا أنا بحاجة للحصول على اسم الملف و امتداد من مسار مثل هذا, ولكن أنا تماما الحيرة في كيفية القيام بذلك باستخدام XSLT.
المحلول
التالي هو مثال على القالب من شأنها أن تنتج المخرجات المطلوبة في XSLT 1.0:
<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>
نصائح أخرى
إذا كنت تستخدم XSLT 2.0, فإنه من السهل:
<xsl:variable name="extension" select="tokenize($filename, '\.')[last()]"/>
إذا كنت لا, انها قليلا أكثر صعوبة.هناك مثال جيد من أورايلي XSLT طبخ.البحث عن "Tokenizing السلسلة".
أعتقد أن هناك أيضا EXSLT وظيفة ، إذا كان لديك المتاحة.
ماذا عن tokenize مع "/" وأخذ آخر عنصر من عناصر المصفوفة ؟
Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
كان XSLT عازف الكمان مرة أخرى في وقت ما...فقدت الاتصال الآن.ولكن HTH
للإشارة هذه المشكلة عادة ما يسمى "فرعية بعد آخر" في XSLT.