简化使用'getpart'参数加速OpenTBS的子模板

时间:2013-01-30 00:25:37

标签: opentbs tinybutstrong

作为previous question的后续内容,我试图真正简化从Word 2010中创建的xml文件中提取的几个.docx模板,并将其用作OpenTBS中的子模板以加快速度我的文档创建。子模板包含一个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);
}

P.S。我应该在the TBS forum上问这个吗?

1 个答案:

答案 0 :(得分:1)

以下是从文件集(TBS子模板)中提取XML元素的两种解决方案。

1)

TBS有一个记录的方法,使您可以获取TBS块的源代码,无论是否有定义块的TBS字段。

请参阅$TBS->GetBlockSource()

如果您已经拥有该部件的TBS块,或者您可以在子模板中创建专用块,则可以使用此方法。

2)

否则,您可以使用随OpenTBS提供的未记录的类clsTbsXmlLoc

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";
   }
}