يجب أن يكون التحقق من حرف البداية "T" ويجب أن يكون الرقم الثلاثة التالي في XSLT
سؤال
أنا أستخدم XSLT1.0 لتحويل XML الخاص بي.
لدي أدناه tabs.xml
<?xml version="1.0"?>
<tcm:ListItems xmlns:tcm="http://www.tridion.com/ContentManager/5.0" ID="tcm:481-87289-4" Managed="68">
<tcm:Item ID="tcm:481-596728-64" Title="T000. Brisbane" pageURL="/australia/brisbane/index.aspx" componentTitle="Overview"/>
<tcm:Item ID="tcm:481-598671-64" Title="Tabs XML"/>
<tcm:Item ID="tcm:481-598672-64" Title="T030 Special Offers" pageURL="/australia/brisbane/specialoffers.aspx" componentTitle="Special Offers"/>
<tcm:Item ID="tcm:481-598673-64" Title="020 Flight Schedules" pageURL="/australia/brisbane/flightschedules.aspx" componentTitle="Flight Schedules"/>
<tcm:Item ID="tcm:481-598674-64" Title="T010 Guide" pageURL="/australia/brisbane/guide.aspx" componentTitle="Guide"/>
</tcm:ListItems>
وأنا أستخدم أدناه XSLT لتحويله!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tcm="http://www.tridion.com/ContentManager/5.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:em="http://www.emirates.com/tridion/schemas" xmlns:tcmse="http://www.tridion.com/ContentManager/5.1/TcmScriptAssistant" exclude-result-prefixes="em xlink tcmse tcm">
<xsl:output method="xml" version="1.0" encoding="UTF-16" indent="yes"/>
<xsl:template match="tcm:ListItems">
<list type="Tabs">
<xsl:apply-templates select="tcm:Item">
<xsl:sort select="@Title" order="ascending"/>
</xsl:apply-templates>
</list>
</xsl:template>
<!-- add field values for each item-->
<xsl:template match="tcm:Item">
<xsl:if test="@componentTitle != ''">
<xsl:element name="tab">
<xsl:attribute name="id">
<xsl:value-of select="substring-after(@ID, '-')"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="@componentTitle"/>
</xsl:attribute>
<xsl:attribute name="url">
<xsl:value-of select="@pageURL"/>
</xsl:attribute>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
في السابق ، كان الأمر جيدًا ، ولكن الآن هناك تغيير آخر مطلوب ، الآن أحتاج إلى أن يتم تقديم تلك العقدة التي تبدأ Title بـ "T" أو "T" وكذلك الحرف الثلاثة التالية على سبيل المثال في XML أعلاه " يجب ألا يأتي جدول الرحلة " <xsl:if test="@componentTitle != ''">
,
الرجاء الاقتراح! كيف يمكن القيام بذلك!
المحلول 5
لقد توصلت إلى الحل أدناه ، يرجى اقتراح ما إذا كان الأمر على ما يرام!
<xsl:template match="tcm:Item">
<xsl:if test="@componentTitle != '' and (starts-with(translate(@Title, 't', 'T'), 'T')and string(number(substring(@Title,2,3))) != 'NaN')">
<xsl:element name="tab">
<xsl:attribute name="id">
<xsl:value-of select="substring-after(@ID, '-')"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="@componentTitle"/>
</xsl:attribute>
<xsl:attribute name="url">
<xsl:value-of select="@pageURL"/>
</xsl:attribute>
</xsl:element>
</xsl:if>
</xsl:template>
كل المدخلات الخاصة بك مطلوب!
نصائح أخرى
إليكم أبسط تعبير سيفعل المطابقة:
translate(substring(@Title, 1, 4), 't12345679', 'T000000000') = 'T000'
ها هو القالب:
<xsl:template match="
tcm:Item[translate(substring(@Title, 1, 4), 't12345679', 'T000000000') = 'T000'
and @componentTitle != '' "/>
من الأفضل وضع منطق الاختيار في نمط المباراة من القالب - ويمكن أن يكون مبسطًا بعض الشيء أيضًا.
<xsl:template match=
"tcm:Item[contains('tT', substring(@Title,1,1))
and
number(substring(@Title,2,3))
=
number(substring(@Title,2,3))
]
">
قاعدة واحدة للتذكر: دائما اختبار إذا بعض السلسلة $s
يمثل رقمًا - مثل هذا:
number($s) = number($s)
يجب تحديد العقد التي تريد تشغيلها في القوالب الخاصة بك في apply-templates
عنصر:
<xsl:apply-templates select="tcm:Item[@componentTitle != ''
and (starts-with(translate(@Title, 't', 'T'), 'T')
and string(number(substring(@Title,2,3))) != 'NaN')]">
لقد استخدمت الاختبار الذي أنتجه التسوية لهذا - إنه يعمل بشكل جيد للمتطلبات (تم اختباره هنا).
هذا أفضل من اختيار كل شيء tcm:Item
العقد واختبارها واحدة تلو الأخرى في القالب.
العمل مع XSLT فقط في بعض الأحيان ، توصلت إلى الحل التالي:
<xsl:if test="@componentTitle != ''">
<xsl:if test="starts-with(@Title,'T') or starts-with(@Title,'t')">
<xsl:if test="string-length(@Title) > 3">
<xsl:if test="string(number(substring(@Title,2,3))) != 'NaN'">
...
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:if>
لقد لاحظت أن هناك وظائف أيضًا lower-case
/upper-case
التي يمكن استخدامها للاختبار للشخصية الأولى كونها t
أو T
ولكن يبدو أنها متوفرة فقط في XSLT2.0.