1

要素に html 形式のテキストが含まれることがある xml ファイルから WordML ドキュメントを作成しています。

<w:p>
  <w:r>
    <w:t> html formatted content is in here taken from xml file! </w:t>
  </w:r>
</w:p>

これが私のテンプレートの設定方法です。ソース xml コンテンツに対してテキスト置換を行う再帰呼び出しテンプレート関数があります。<b>「 」タグに遭遇すると、「 」を含む文字列を CDATA に出力し</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>て、現在の実行を閉じ、太字の書式設定を有効にして新しい実行を開始します。" </b>" タグに到達すると、それを次の CDATA 文字列 " " に置き換えます</w:t></w:r><w:r><w:t>

私がやりたいのは、XSL を使用して実行タグを閉じ、CDATA 文字列挿入を使用せずに新しい実行を開始することです。これは可能ですか?

4

4 に答える 4

3

WordML での作業はトリッキーです。XSLT を使用して任意の XML を WordML に変換する際の 1 つのヒントは、ブロックを処理するときにテキスト ランを気にするのではなく、text() ノードに直接一致するテンプレートを作成し、そこでテキスト ランを作成することです。Word は、テキスト ランをネストしても気にしないことがわかりました。これにより、問題の解決がはるかに容易になります。

   <xsl:template match="text()" priority="1">
         <w:r>
            <w:t>
               <xsl:value-of select="."/>
            </w:t>
         </w:r> 
   </xsl:template>

   <xsl:template match="@*|node()">
       <xsl:apply-templates select="@*|node()"/>
   </xsl:template>

   <xsl:template match="para">
      <w:p>
         <xsl:apply-templates select="text() | *" />
      </w:p>
   </xsl:template>

   <xsl:template match="b">
      <w:r>
         <w:rPr>
            <w:b />
         </w:rPr>
         <w:t><xsl:apply-templates /></w:t>
      </w:r>
   </xsl:template>

これにより、タグをエスケープされたテキストとして直接挿入するという悪い XSLT 手法を回避できます。ネストされたテキスト ランとして太字のタグが表示されることになりますが、前述したように、Word はそれほど気にしません。この手法を使用する場合は、テンプレートを段落間の空白に適用しないように注意する必要があります。これは、テキスト テンプレートがトリガーされ、コンテキスト外のランが作成されるためです。

于 2008-10-30T17:38:23.447 に答える
0

私があなたの問題を理解していれば、おそらくあなたを助けることができます... HTMLはCDATAセクションにありますか、それとも入力ドキュメントの一部として解析されますか(したがって整形式のXML)? 「テキスト置換」について話しているので、「html 形式のコンテンツ」を単一の文字列 (CDATA) として扱うため、文字列置換を実行するには再帰的な呼び出しテンプレート関数が必要であると想定します。XSL マッチング テンプレートを使用して現在行っていることを実行できるようにする唯一の方法は、解析されたドキュメント (入力ドキュメント) の html 部分を作成することです。このような場合は、bタグを一致させて適切な出力に置き換えることができます (繰り返しますが、これは常に有効な XML として解析できることを前提としています)。あなたの問題は現在シフトしています...(私があなたの問題を正しく理解していれば)あなたが何をしたかw:tw:r要素を 'reopen' します... XSLT でこれをうまく行うのは (おそらくご想像のとおり) 非常に難しいため、これは困難です (テンプレート A で要素を作成し、それをテンプレート B で閉じることはできません)。これを実現するには、エスケープされていない出力などをいじり始める必要があります。私は今、多くの仮定を立てましたが、ここにあなたのやり方を助ける小さな例があります:

入力.xml

<doc xmlns:w="urn:schemas-microsoft-com:office:word">
<w:p>
  <w:r>
    <w:t>before<b>bold</b>after</w:t>
  </w:r>
</w:p>
</doc>

convert_html.xsl

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="/doc/w:p/w:r/w:t//b">
  <xsl:value-of select="'&lt;/w:t>&lt;/w:r>&lt;w:r>&lt;w:rPr>&lt;w:b/>&lt;/w:rPr>&lt;w:t>'" disable-output-escaping="yes" />
  <xsl:apply-templates select="@*|node()"/>
  <xsl:value-of select="'&lt;/w:t>&lt;/w:r>&lt;w:r>&lt;w:t>'" disable-output-escaping="yes" />
</xsl:template>

現在実行中

xalan input.xml convert_html.xsl

生産する

<?xml version="1.0" encoding="UTF-8"?><doc xmlns:w="urn:schemas-microsoft-com:office:word">
<w:p>
  <w:r>
    <w:t>before</w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t>bold</w:t></w:r><w:r><w:t>after</w:t>
  </w:r>
</w:p>
</doc>

私はあなたが望んでいたものだと思います。

これが多少役立つことを願っています。

于 2008-10-27T06:57:32.680 に答える
0

HTML > WordML を完全に完成させるには、この編集済みのコード バージョンをお勧めします。

<xsl:template match="Body"><xsl:apply-templates select="p"/></xsl:template>

<xsl:template match="text()" priority="1"><w:r><w:t><xsl:value-of select="."/></w:t></w:r></xsl:template>

<xsl:template match="@*|node()"><xsl:apply-templates select="@*|node()"/></xsl:template>

<xsl:template match="p"><w:p><xsl:apply-templates select="text() | *" /></w:p></xsl:template>

<xsl:template match="b"><w:r><w:rPr><w:b /></w:rPr><xsl:apply-templates /></w:r></xsl:template>
<xsl:template match="i"><w:r><w:rPr><w:i /></w:rPr><xsl:apply-templates /></w:r></xsl:template>
<xsl:template match="u"><w:r><w:rPr><w:u w:val="single" /></w:rPr><xsl:apply-templates /></w:r></xsl:template>

タグでラップされた XML のどこかに HTML があるとします。

于 2009-07-27T16:54:04.357 に答える
0

あなたの説明から、埋め込まれたhtmlを解析できるようです。もしそうなら、単にテンプレートを適用するだけで、あなたが望むことができるはずです。出力の wordML は正しくない可能性がありますが、これが役立つことを願っています。

サンプル入力:

<text>
  <para>
    Test for paragraph 1
  </para>
  <para>
    Test for <b>paragraph 2</b>
  </para>
</text>

変身:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://foo">
<xsl:template match="/">
  <w:p>
    <w:r>
      <xsl:apply-templates/>
    </w:r>     
  </w:p>
</xsl:template>
  <xsl:template match="para">
    <w:t>
      <xsl:apply-templates/>
    </w:t>
  </xsl:template>

  <xsl:template match="b">
    <w:rPr>
      <w:b/>
    </w:rPr>
      <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet> 

結果:

<w:p xmlns:w="http://foo">
  <w:r>
    <w:t>
      Test for paragraph 1
    </w:t>
    <w:t>
      Test for <w:rPr><w:b /></w:rPr>paragraph 2
    </w:t>
  </w:r>
</w:p>
于 2008-10-27T14:30:44.827 に答える