作为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上问这个吗?
答案 0 :(得分:1)
以下是从文件集(TBS子模板)中提取XML元素的两种解决方案。
1)
TBS有一个记录的方法,使您可以获取TBS块的源代码,无论是否有定义块的TBS字段。
如果您已经拥有该部件的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";
}
}