4

1 つの Tridion スキーマに追加のフィルタリング xslt を適用したいと考えています。

「画像」という名前のフィールドがあります。これは RTF であり、書式設定機能の編集で選択することにより、画像とハイパーリンクを許可するように構成されています。

その背後にある考え方は、RTF に Image を挿入し、RTF フィールドとして作成することです。

サンプルの有効なソース:

1.<a title="google site" href="http://google.com"><img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/></a>
2.<a title="Internal link" href="tcm:202-9720"><img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/></a>

RTF ではハイパーリンクと画像が許可されているため、ユーザーがそれらを異なる形式で入力する可能性があります。無効:

1.<a title="google site" href="http://google.com"></a>
  <img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/>

2.<img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/>
 <a title="google site" href="http://google.com"></a>

3.<a title="google site" href="http://google.com"><img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/></a>
  <a title="Internal link" href="tcm:202-9720"><img style="width: 141px; height: 167px;" alt="Image" title="Image" src="tcm:202-11587"/></a>

ルール:

1.Only one Image should be allowed and it should be hyperlink.
2.There should be one <img> tag wrapped by one <a> tag.
3. Multiple images are not allowed.

これは、イベント システムを使用して実行できることを知っています。それでも、XSLT フィルタリングを適用して実装することを考えました。

XSLT フィルタリング ソース:

<xsd:element name="image" minOccurs="0" maxOccurs="1" type="tcmi:XHTML">
            <xsd:annotation>
                <xsd:appinfo>
                    <tcm:ExtensionXml xmlns:tcm="http://www.tridion.com/ContentManager/5.0"></tcm:ExtensionXml>
                    <tcm:Size xmlns:tcm="http://www.tridion.com/ContentManager/5.0">2</tcm:Size>
                    <tcm:FilterXSLT xmlns:tcm="http://www.tridion.com/ContentManager/5.0">
                        <stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
                            <output omit-xml-declaration="yes" method="xml" cdata-section-elements="script"></output>
                            <template match="/ | node() | @*">
                                <copy>
                                    <apply-templates select="node() | @*"></apply-templates>
                                </copy>
                            </template>
                            <template match="*[      (self::br or self::p or self::div)     and      normalize-space(translate(., &apos; &apos;, &apos;&apos;)) = &apos;&apos;     and      not(@*)     and      not(processing-instruction())     and      not(comment())     and      not(*[not(self::br) or @* or * or node()])     and      not(following::node()[not(         (self::text() or self::br or self::p or self::div)        and         normalize-space(translate(., &apos; &apos;, &apos;&apos;)) = &apos;&apos;        and         not(@*)        and         not(processing-instruction())        and         not(comment())        and         not(*[not(self::br) or @* or * or node()])       )])     ]">
                                <!-- ignore all paragraphs and line-breaks at the end that have nothing but (non-breaking) spaces and line breaks -->
                            </template>
                            <template match="br[parent::div and not(preceding-sibling::node()) and not(following-sibling::node())]">
                                <!-- Chrome generates <div><br/></div>. Renders differently in different browsers. Replace it with a non-breaking space -->
                                <text> </text>
                            </template>
                            <template name="FormattingFeatures">
                                <FormattingFeatures xmlns="http://www.tridion.com/ContentManager/5.2/FormatArea" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                    <Doctype>Transitional</Doctype>
                                    <AccessibilityLevel>0</AccessibilityLevel>
                                    <DisallowedActions>
                                        <Bold></Bold>
                                        <Italic></Italic>
                                        <Underline></Underline>
                                        <Strikethrough></Strikethrough>
                                        <Subscript></Subscript>
                                        <Superscript></Superscript>
                                        <AlignLeft></AlignLeft>
                                        <Center></Center>
                                        <AlignRight></AlignRight>
                                        <Bullets></Bullets>
                                        <Numbering></Numbering>
                                        <IndentDecrease></IndentDecrease>
                                        <IndentIncrease></IndentIncrease>
                                        <Font></Font>
                                        <Background></Background>
                                        <InsertCharacter></InsertCharacter>
                                        <Anchor></Anchor>
                                        <Table></Table>
                                        <TableWidth></TableWidth>
                                        <TableHeight></TableHeight>
                                        <TableCellSpacing></TableCellSpacing>
                                        <TableCellPadding></TableCellPadding>
                                        <TableHAlign></TableHAlign>
                                        <TableBorderSize></TableBorderSize>
                                        <TableBorderStyle></TableBorderStyle>
                                        <TableBorderColor></TableBorderColor>
                                        <TableBackground></TableBackground>
                                        <TableCellWidth></TableCellWidth>
                                        <TableCellHeight></TableCellHeight>
                                        <TableCellHAlign></TableCellHAlign>
                                        <TableCellVAlign></TableCellVAlign>
                                        <TableCellBackground></TableCellBackground>
                                        <HLine></HLine>
                                        <SectionType></SectionType>
                                        <H1></H1>
                                        <H2></H2>
                                        <H3></H3>
                                        <H4></H4>
                                        <H5></H5>
                                        <H6></H6>
                                        <Style></Style>
                                        <Language></Language>
                                        <Abbreviation></Abbreviation>
                                        <CurrentElement></CurrentElement>
                                    </DisallowedActions>
                                    <DisallowedStyles></DisallowedStyles>
                                </FormattingFeatures>
                            </template>
                        </stylesheet>
                    </tcm:FilterXSLT>
                </xsd:appinfo>
            </xsd:annotation>
        </xsd:element>

スキーマ ソースの tcm:FilterXSLT に xslt コードを記述して、それができるかどうかを知りたいです。

誰でもそれを行う方法を助けることができますか。

ありがとう。

4

1 に答える 1

4

これはうまくいくはずです。次のことを行います。

  • リッチ テキストの最初の 'a' 要素を探します
  • その中に「img」要素がある場合は、そのまま保持します
  • 存在しない場合は、リッチ テキスト内の他の場所にある最初の img 要素を探し、それを a 要素に移動します。
  • 他のすべての要素が削除されます

2011 SP1 でテスト済み。そして、私は言わなければなりません、xsltで再び遊ぶのは楽しかったです、それは長すぎました:)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" method="xml" cdata-section-elements="script"></xsl:output>

  <xsl:template match="body">
    <xsl:copy>
      <xsl:apply-templates select="//a[1]"></xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

    <xsl:template match="node() | @*">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*"></xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
    <xsl:template match="//a">
      <xsl:copy>
        <xsl:apply-templates select="@*"></xsl:apply-templates>
          <xsl:choose>
            <xsl:when test="not(img)">
              <xsl:copy-of select="//img"></xsl:copy-of>
        </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="node()"></xsl:apply-templates>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
于 2012-07-03T10:12:43.593 に答える