1

Symphony CMS 内で、ページ コンテンツ (おそらく DocBook を使用) を含む XML ドキュメントと、中央の頭字語/略語リポジトリである別の XML ドキュメントを使用できるようにしたいと考えています。たとえば、このリポジトリは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../utilities/master.xsl"?>
<terminology>
    <abbreviations>
        <term abbr="World Wildlife Fund">WWF</term>
    </abbreviations>
</terminology>

次に、XSL ドキュメントは XPath を使用して変換を実行し、DocBook XML をテンプレート内に表示します。

たとえば、DocBook から出力されたコピー内に「WWF」というテキストが含まれている場合、XSLT と XPath は、頭字語/略語リポジトリをリソースとして使用して、その単語をタイトル付きの略語タグでラップします。

<abbr title="World Wildlife Fund">WWF</abbr>

セットアップ全体は、DocBook コンテンツ内で特定のテキスト文字列が表示されるたびに呼び出すことができる、リポジトリに大量の用語を含めるのに十分なほど拡張可能である必要があります。

私は必要なものを提供してくれるかのように聞こえるHTML Ninja Techniqueの方向性を指摘されましたが、例は HTML を引き込んでおり (これは少し奇妙に思えます)、実行方法については詳しく説明していません。私が作成しようとしているテキストの文字列に対する一種の操作。

注目に値するのは、Symphony Utilities の master.xsl テンプレート内でこれを実行しようとしてきたことです。このファイル内でこれが機能しない場合は、修正していただければ幸いです。

私は XSLT と XPath に非常に慣れていないので、これに答えるときに私の知識を何も仮定しないでください。現時点では、XML ドキュメントと XLS ドキュメントを結び付けるのにも苦労しています。概念実証を作成できるようにするための段階的な指示をいただければ幸いです。

4

1 に答える 1

1

同じ場所に3セットのファイルがあると仮定します。

  1. ページ ドキュメント (XML)。

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="transform.xsl"?>
    <html>
        <span>WWF1</span>
        <span>WWF</span>
        <span>WWF2</span>
    </html>
    
  2. 頭字語リポジトリ (XML)

    <?xml version="1.0"?>
    <terminology>
      <abbreviations>
        <term abbr="World Wildlife Fund 1">WWF1</term>
        <term abbr="World Wildlife Fund 2">WWF2</term>
      </abbreviations>
    </terminology>
    
  3. トランスフォーマー (XSL)。

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>
       <xsl:template match="/">
          <xsl:apply-templates select="html" mode="transform">
             <xsl:with-param name="repository" select="document('repository.xml')/terminology"/>
          </xsl:apply-templates>
       </xsl:template>
    
      <!-- Updated Template Start-->
      <xsl:template match="text()" mode="transform" priority="2.5">
         <xsl:param name="repository" />
         <xsl:variable name="this" select="." />
         <xsl:variable name="term" select="$repository/abbreviations/term[contains($this,./text())]" />
         <xsl:choose>
            <xsl:when test="count($term) > 0">
           <xsl:value-of select="substring-before(., $term/text())"/>
               <xsl:variable name="termTitle" select="$term/@abbr" />
               <abbr title="{$termTitle}"><xsl:value-of select="$term/text()"/></abbr>
       <xsl:value-of select="substring-after($this, $term/text())"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:copy-of select="."/>
            </xsl:otherwise> 
         </xsl:choose>
       </xsl:template>
       <!-- Updated Template Stop-->
    
       <xsl:template match="node()" mode="transform" priority="2">
          <xsl:param name="repository" />
          <xsl:copy>
             <xsl:apply-templates mode="transform">
                <xsl:with-param name="repository" select="$repository"/>
             </xsl:apply-templates>
          </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

トランスフォーマー ファイルは、次のような出力を提供します。

<html>
  <span><abbr title="World Wildlife Fund 1">WWF1</abbr></span>
  <span>WWF</span>
  <span><abbr title="World Wildlife Fund 2">WWF2</abbr></span>
</html>

別のノードを追加するだけで頭字語をスケーリングできます。

XSLT を変更する必要はありません。

これがお役に立てば幸いです。

于 2012-07-01T14:13:15.157 に答える