2009-11-13 118 views
1

我有一个以WordProcessingML格式保存为XML的Word 2003文档。它包含几个占位符,它们将被适当的内容动态替换。 但是,问题在于Word似乎随机地将它们分割为单独的单词。例如,而不是这样的:MS Word以XML格式拆分单词

<w:t>${dl.d.out.ecs_rev}</w:t> 

我有这样的:

... 
<w:t>${</w:t> 
</w:r> 
<w:r wsp:rsidR="005D11C0"> 
    <w:rPr> 
    <w:sz w:val="20" /> 
    <w:sz-cs w:val="20" /> 
    </w:rPr> 
    <w:t>dl.</w:t> 
</w:r> 
<w:r wsp:rsidRPr="00696324"> 
<w:rPr> 
    <w:sz w:val="20" /> 
    <w:sz-cs w:val="20" /> 
</w:rPr> 
<w:t>d.out.ecs_rev}</w:t> 
... 

有没有办法保存使用Word 2003中的“干净”的XML文档,或者是有任何现有的解决方案,它可以做清洁?

我试着用Java编写一个方法来连接占位符的分隔部分,但由于不同切割组合的数量相对较大,因此算法比我必须做的原始任务要复杂得多,所以它本身就是问题。

回答

1

Word 2003 XML异常复杂且难以解码。您获取多个标签的原因是因为Word ML生成名为runs的标签(w:r标签)。据我所知,没有简单的方法来清理上面的XML。我会建议使用HTML而不是WordML。使用适当的内容来操作和替换占位符更方便。 如果成本不是目标,请使用Aspose等产品。它为你做了一切,使用简单。

3

如果您可以控制原始Word文档,则可以停止Word插入rsid并突出显示语法/拼写错误。

  Word.Options opts = Word.Options; 
      opts.CheckGrammarAsYouType = false; 
      opts.CheckGrammarWithSpelling = false; 
      opts.CheckSpellingAsYouType = false; 
      opts.StoreRSIDOnSave = false; 

如果例如您改变字体部分的方式通过单词,单词仍然会被拆分。

嗯,我有一个简单的+丑陋的xslt位,我用它来清理WordML,就像您发布的示例一样。如果你愿意的话,我可以将它提交给docx4j,但正如你所说,有各种组合不会被覆盖。无论如何,如果你想要它,请发布到docx4j论坛。

更健壮的方法是提取纯文本,并将纯文本与XML相关联,以便您可以搜索纯文本,然后从该文本转到XML。