2010-09-05 4 views
5

numaralı olması gerekir. XML'imi dönüştürmek için XSLT1.0 kullanıyorum.Başlangıç ​​karakterinin 'T' olması ve sonraki 3 karakterin xslt

Ben 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> 

altında yaşıyorum Ve bunu dönüştürmek için XSLT altında kullanıyorum!

<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> 

Daha önce, gayet iyi çalışıyordu, ama şimdi gerekli başka değişiklik olduğunda, şimdi render kimin When @ BAŞLıK 'T' veya 't' ile başlar yanı sıra gelecek 3 karakter olmalıdır edilecek olanlar düğümü gerek Örneğin, yukarıdaki xml "Uçuş Takvimi" nin numarası gelmemelidir, sadece bir tane daha ve koşul yazmam gerektiğini varsayalım. <xsl:if test="@componentTitle != ''">,

Lütfen öneriniz! nasıl yapılabilir?

+0

. Basitleştirilmiş tek liner ifadesi için cevabımı ve bir dizenin bir sayı içerip içermediğini kontrol etmenin standart yolunu görün. :) –

+0

İyi soru (+1). Ve benim en iyi tek çarka bak. – dolmen

cevap

-1

Aşağıdaki çözümle geldim, lütfen sorun değil.

<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> 

Tüm girdiniz gerekli!

+0

Testinizi şablona koymak yerine, düğümleri seçerken, bir "uygulama şablonu" öğesinde kullanmalısınız. – Oded

+0

@Oded: En iyi XSLT stili "saf itme" dir. Seçme, sadece eşleştir. Saf bir itme tarzı örnekleri için çözümümü ve verdiğim diğer cevapları görün. –

+0

'T0.0' eşleşiyor. Sadece rakam kabul eden cevabımı görün. – dolmen

0

sadece çok nadiren XSLT'de ile çalışarak, aşağıdaki çözüm geldi: Ben de orada fonksiyonları fark ettim

<xsl:if test="@componentTitle != ''"> 
    <xsl:if test="starts-with(@Title,'T') or starts-with(@Title,'t')"> 
    <xsl:if test="string-length(@Title) &gt; 3"> 
     <xsl:if test="string(number(substring(@Title,2,3))) != 'NaN'"> 
... 
     </xsl:if> 
    </xsl:if> 
    </xsl:if> 
</xsl:if> 

olmanın ilk karakter için test için kullanılabilecek lower-case/upper-case bir t veya T ama sadece XSLT2.0'da mevcut görünüyor.

+0

Çok Teşekkürler Andre zaman ve çözüm için teşekkürler, ancak çözüm önerimi kendim de önerebilir misiniz? –

+0

Dört yuvalanmış 'if' s !!!! Kesinlikle refactored olabilir. –

1

Sen sen apply-templates öğesi içine şablonları üzerinde çalışmak istediğiniz düğümleri seçmelidir: Bunun için üretilen @solution testini kullandık

<xsl:apply-templates select="tcm:Item[@componentTitle != '' 
          and (starts-with(translate(@Title, 't', 'T'), 'T') 
          and string(number(substring(@Title,2,3))) != 'NaN')]"> 

- bu (gereksinimi için iyi çalışır here test edilmiştir.

Bu, tüm tcm:Item düğümlerini seçmekten ve şablonda tek tek test etmekten daha iyidir.

+0

Saf "itme" stili daha iyi - seçmeyin, sadece eşleştirin. –

+0

-1, 'T0.0' eşleşmesi nedeniyle. Sayı testi ve desen eşleştirme uyumu için – dolmen

1

Seçim mantığı en iyi şablonun eşleşme modeline yerleştirilir - ve bu biraz da basitleştirilebilir.

<xsl:template match= 
"tcm:Item[contains('tT', substring(@Title,1,1)) 
     and 
      number(substring(@Title,2,3)) 
      =  
      number(substring(@Title,2,3)) 
      ] 
"> 

bir kural hatırlamak: Bazı dize $s bir sayıyı temsil eder, her zaman sınamak - böyle:

İşte

number($s) = number($s)

+0

+1. –

2

eşleştirme yapacağız basit ifadesidir:

translate(substring(@Title, 1, 4), 't12345679', 'T000000000') = 'T000' 

Şablon şu şekildedir:

Bir soru (+1) .
<xsl:template match=" 
tcm:Item[translate(substring(@Title, 1, 4), 't12345679', 'T000000000') = 'T000' 
and @componentTitle != '' "/> 
+0

+1, çünkü bu genellikle yararlı bir modeldir. yani, iş kuralınızı uygulayan bir dize eşleşmesi yapmak için çeviriyi kullanarak. Ve okunamaz halde olmadan da. –