5

XMLの変換にXSLT1.0を使用しています。

私は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」で始まるノードをレンダリングする必要があります。次の3文字は、たとえば上記のxmlの数字である必要があります。フライトスケジュール」は来るべきではありません、私はもう1つ書いて条件を記入する必要があると思います<xsl:if test="@componentTitle != ''">

提案してください!どのようにそれを行うことができますか!

4

5 に答える 5

2

マッチングを行う最も簡単な式は次のとおりです。

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

テンプレートは次のとおりです。

<xsl:template match="
 tcm:Item[translate(substring(@Title, 1, 4), 't12345679', 'T000000000') = 'T000'
 and @componentTitle != '' "/>
于 2010-09-09T12:33:35.967 に答える
1

要素のテンプレートで操作するノードを選択する必要があります。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')]">

私は@solutionがこのために作成したテストを使用しました-それは要件に対してうまく機能します(ここでテストされています)。

tcm:Itemこれは、すべてのノードを選択して、テンプレートで一度に1つずつテストするよりも優れています。

于 2010-09-05T07:49:39.757 に答える
1

選択ロジックは、テンプレートの一致パターンに組み込むのが最適です。また、少し単純化することもできます。

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

覚えておくべき1つのルール$s:文字列が数字を表すかどうかを常にテストします-次のように:

number($s) = number($s)

于 2010-09-05T14:25:40.727 に答える
0

XSLTを使用するのはごくまれですが、次の解決策を思いつきました。

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

最初の文字がまたはであるかどうかをテストするために使用できる関数lower-case/もあることに気付きましたが、それらはXSLT2.0でのみ使用できるようです。upper-casetT

于 2010-09-05T07:15:11.697 に答える
-1

私は以下の解決策を思いついた、それが大丈夫かどうか提案してください!

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

すべての入力が必要です!

于 2010-09-05T07:25:19.020 に答える