0

以前の質問の補足として、Word 2010 で作成されたファイルxmlから抽出され、 OpenTBSでサブテンプレートとして使用されるいくつかのテンプレートを大幅に簡素化して、ドキュメントの作成を高速化しようとしています。サブテンプレートには、次のように、メイン テンプレートで使用するすべてのブロックが.docx含まれています。mc:AlternateContent

[LineItem.template;block=w:r;file='templates/[val].xml';getpart=(mc:AlternateContent)]

複数 (20) の大きな (>100KB) サブテンプレートが OpenTBS の速度に深刻な影響を与える可能性があることに気付きました。使用していないコード (mc:AlternateContent 以外) を削除したいと思います。私はすでに、TBS を介して自分のテンプレートで他の処理を行い、簡略化されたバージョンをキャッシュすることを計画しているので、OpenTBS の getpart 機能を使用して、このデータをより大きなテンプレートから同時に取得できれば素晴らしいと思います。これは可能ですか?

たとえば、この (疑似) コードを私の処理に適合させるには:

foreach($templates as $template){ //loop through xml templates
    $TBS->LoadTemplate($template);
    $simpleTemplate = $template->getpart('mc:AlternateContent'); 
    /* 
    / simpleTemplate now holds all the xml inside the mc:AlternateContent tags
    / (everything that would have been included in my template had I used attribute
    / getpart=(mc:AlternateContent) in my file inclusion) 
    */
    $simpleTemplate->save('simple/'.$template);
}

PS代わりにTBSフォーラムでこれを尋ねるべきですか?

4

1 に答える 1

1

ファイル セット (TBS サブテンプレート) から XML 要素を抽出する 2 つのソリューションを次に示します。

1)

TBS には、ブロックを定義する TBS フィールドの有無にかかわらず、TBS ブロックのソース コードを取得できる文書化された方法があります。

$TBS->GetBlockSource()を参照してください

その部分の TBS ブロックが既にある場合、またはサブテンプレートに専用ブロックを作成できる場合は、この方法を使用できます。

2)

それ以外の場合は、clsTbsXmlLocOpenTBS で提供されるドキュメント化されていないクラスを使用できます。

foreach ($templates as $template) {
   $contents = file_get_contents($template);
   $x = clsTbsXmlLoc::FindElement($contents, 'mc:AlternateContent', 0);
   if ($x) {
      $src = $x->GetSrc();
      // use $x->GetInnerSrc() in order to get the content of <mc:AlternateContent>
      // but wihtout the <mc:AlternateContent> tags.
      file_put_contents('simple/'.$template);
   } else {
      echo "Element no found in sub-template $template";
   }
}
于 2013-01-31T11:03:35.523 に答える