0

作为我上一个问题的后续,我试图真正简化从 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);
}

PS我应该在TBS论坛上问这个吗?

4

1 回答 1

1

这是从一组文件(它们是 TBS 子模板)中提取 XML 元素的两种解决方案。

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 回答