6

コンポーネントのRTFフィールドでアンカーボタンを使用しようとしていますが、予期しない動作が発生します。デザインビューからChromeブラウザ<h2>My Heading</h2>を使用して、アンカーとして使用する見出し(つまり)を強調表示/選択し、アンカーボタンを押してアンカー名(つまりmy_place)を入力します。

これにより、次のコードが[ソース]タブに表示されます。

<a name="my_place" id="myplace"/><h2>My Heading</h2>

<a/>これにより、自己終了タグが原因で、ブラウザにHTMLを表示するときにレンダリングの問題が発生します。

次の3つのHTMLフラグメントのいずれかがHTMLソースに挿入されることを期待していました。

<a name="my_place" id="myplace"><h2>My Heading</h2></a>

また

<h2><a name="my_place" id="myplace">My Heading</a></h2>

また

<a name="my_place" id="myplace"><a><h2>My Heading</h2>

他の誰かがこれを経験しましたか?または、(HTMLを手動で編集せずに)期待したことを達成する方法を知っています。または、これは製品の現在のバージョンのバグですか。

4

4 に答える 4

6

添付されているのは私のサンプルXSLTテンプレートです。

<template match="a[(@name) and (count(node()) = 0)]">
    <copy>
        <apply-templates select="@*"/>
        <xhtml:span xmlns:xhtml="http://www.w3.org/1999/xhtml" class="hidden"> </xhtml:span>
    </copy>
</template>

これにより、厳密に必要とされる以上のことが追加されますが、コンテンツ配信側でのXML操作に起因する他のいくつかの問題が処理されます。

基本的に、すべての空のaタグをname属性と照合し、それらの間に何かを追加して、それらが自動的に閉じるのを防ぎます。この例では、XSLTを使用してすべてのXMLを後処理するため、空のタグを常に閉じるという課題があります。そのため、ダーティハックとして、span問題を防ぐために空のタグの間に非表示のタグを挿入しています。

于 2012-05-10T19:48:17.120 に答える
6

クリスに感謝します。私の要件に合うようにソリューションを編集したので、将来この問題を抱えている人のために共有したいと思いました。

注:これにより、アンカー内のテキストが移動し、外側のテキストが削除されます。htmlではなくテキストのみを含むことを目的としたアンカーを修正します。つまり、私のソリューションはこのタグを修正します:

<p><a name="anchor1" id="anchor1"></a>Anchor text</p>

<p><a name="anchor1" id="anchor1">Anchor text</a></p>

しかし、これではありません:

<p><a name="anchor1" id="anchor1"></a><h1>Anchor text</h1></p>

これが私のxslです。うまくいけば、それはあなたにベースを与えるのに役立つでしょう、私はあなたが次のタグを探すためにそれを簡単に更新できると確信しています(私は私の解決策のためにこれを必要としません)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" method="html" cdata-section-elements="script"/>
    <xsl:template match="/ | node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <!-- fixes Tridion bug when using interface button to insert anchor in rich text field -->
    <!-- gets all empty anchor tags with an id and takes any following text and copies it inside anchor -->
    <xsl:template match="a[(@id) and (count(node()) = 0)]">
       <xsl:copy>
            <xsl:for-each select="@*">
                <xsl:attribute name="{name(.)}">
                    <xsl:value-of select="."/>                    
                </xsl:attribute>
            </xsl:for-each>
            <xsl:value-of select="normalize-space(following-sibling::text())"/>
        </xsl:copy>
    </xsl:template>
    <!-- delete any text after an empty anchor (template above has already copied this text inside the anchor) -->
    <xsl:template match="text()[preceding-sibling::a[(@id) and (count(node()) = 0)]]" ></xsl:template>
</xsl:stylesheet>

これが私のテストXMLです

<?xml version ="1.0"?>
<?xml-stylesheet type="text/xsl" href="tridionhtmlfield.xsl"?>
<html>
    <head></head>
    <body>
        <p><a id="anchorlink" name="anchorlink" title="Anchor link" href="#Anchor">Anchor link</a>Some text after</p>
        <p><a name="broken-with-html-name" id="broken-with-html-id"></a><h1>Anchor - broken with html</h1></p>
        <p><a name="broken-text-only-name" id="broken-text-only-id"></a>Anchor - broken text only</p>
        <p><a name="broken-notext-name" id="broken-notext-id"></a></p>
        <p><a name="correct-name" id="correct-id">Anchor - correctly rendered</a> Some text after</p>
    </body>
</html>

変換後:

<html>
    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
    <body>
        <p><a id="anchorlink" name="anchorlink" title="Anchor link" href="#Anchor">Anchor link</a>Some text after</p>
        <p><a name="broken-with-html-name" id="broken-with-html-id"></a><h1>Anchor - broken with html</h1></p>
        <p><a name="broken-text-only-name" id="broken-text-only-id">Anchor - broken text only</a></p>
        <p><a name="broken-notext-name" id="broken-notext-id"></a></p>
        <p><a name="correct-name" id="correct-id">Anchor - correctly rendered</a> Some text after</p>
    </body>
</html>

お役に立てれば

于 2012-08-15T16:39:18.317 に答える
4

クリスにはバグのように見えます。Chrome、Firefox、IEで確認しました。現在のテキスト選択を無視する必要があるのは完全に直感に反します。(プラス面として、[ソース]タブで手動で修正すると、すべてが完全に動作しているように見えます。)

これをTridionに報告し、テンプレートまたはフィルターXSLTを変更して回避することをお勧めします。

于 2012-05-10T16:48:27.860 に答える
2

Tridionのバグです。私が提案する(そして特定のインストールで実装した)回避策の1つは、次のことを行うことです。

  1. FormatAreaStyles.cssファイル(Tridion CMSプログラムファイルにあります)(およびWebサイトで使用されるCSSファイル)を編集して、次のようなクラスを含めます。

.hiddenanchor { width:1px; height: 1px; display: block; text-indent:-50000px; }

  1. CSSファイルを(新しいクラスで)公開して、アンカーが適切にフォーマットされるようにします。
  2. そして、アンカーを構築しているコンポーネントでは、次のことを行う必要があります。

    a。コンポーネント(ターゲットを配置する場所)に単語または一連の単語を入力し、

    b。そのテキストを選択し、それにアンカータグを適用します。

    c。次に、作成した新しいクラス(.hiddenanchor)をアンカーに適用します。

最終的に、「見えない」アンカーは次のようになります。

<a name="anchorname" id="anchorname" class="hiddenanchor">Anchor Name</a>

これは大雑把な回避策です—完全に認められています。しかし、それは機能します。次のDOMオブジェクトが閉じるまで、ハイパーリンク/アンダーラインのスタイル設定は終了しません。

CSSの説明として、アンカーが機能し、アンカーリンクからアクセスできるようにするには、アンカーが技術的にDOMに表示されている必要があります。したがって、「display:none」は機能しません。テキストインデントアプローチを採用する代わりに、テキストを画面から絶対位置または固定位置にすることもできます。

于 2012-07-12T18:59:37.810 に答える