Xpath部分为NULL,通过内容控制工具包设置xpath

时间:2015-09-15 09:57:04

标签: xpath docx4j

我已经能够通过代码设置文档中找到的占位符的xpath。


for (Object o : finderSdtRun.results) {

            if (o instanceof SdtRun){

                SdtPr sdtPr=((SdtRun) o).getSdtPr();
                Tag t = sdtPr.getTag();                 
                CTDataBinding ctDataBinding = Context.getWmlObjectFactory().createCTDataBinding();
                //JAXBElement jaxbDB = Context.getWmlObjectFactory().createSdtPrDataBinding(ctDataBinding);
                sdtPr.setDataBinding(ctDataBinding);
                ctDataBinding.setXpath("tuttappostaferragost");
                ctDataBinding.setStoreItemID("something");          

                ObjectFactory factory = new org.opendope.xpaths.ObjectFactory();




                DataBinding db = factory.createXpathsXpathDataBinding();
                db.setXpath("tuttappostaferragost");
                db.setStoreItemID("something");

                Xpaths.Xpath xp = factory.createXpathsXpath();
                xp.setDataBinding(db);
                xp.setId("something");



          try {
                    wordMLPackage.getMainDocumentPart().getXPathsPart().getContents().getXpath().add(xp);
                } catch (Docx4JException e) {
                    e.printStackTrace();
                }       

                ;

问题在于,一旦设置,它们就不会被单词识别,所以我想将创建的Xpath添加到 new XpathPart,然后将其添加到主Document部分。 但我失败了,因为方法:

 wordMLPackage.getMainDocumentPart().getXPathsPart() 

返回 null 。这听起来很合理,因为只设置了内容控件,没有任何Xpath。

然后我通过内容控制工具包和上面相同的代码行设置了Xpath,返回给我null,这给我困惑的想法增加了很多困惑。

有没有办法告诉文档新的Xpath已添加到文档中? 我的意思是,如果有办法通过代码添加Xpath(w:数据绑定w:storedItemId标签),为什么不能使它工作?

一般情况下,我想通过代码添加Xpath和所有必要的信息,避免使用任何工具包。 谢谢:D

1 个答案:

答案 0 :(得分:1)

首先,您必须决定是否需要普通的旧数据绑定或其他OpenDoPE功能(使用内容控制标记来支持重复,条件等)。

如果您使用的是OpenDoPE扩展,则只需要一个XPath部分。

我现在假设您只是想要进行基本的Word内容控制数据绑定。

要以编程方式设置它,您需要将一个自定义xml部件和一个rel添加到其itemProps.xml部件,其中包含以下内容:

<ds:datastoreItem ds:itemID="{5448916C-134B-45E6-B8FE-88CC1FFC17C3}" xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml">
  <ds:schemaRefs/>
</ds:datastoreItem>

(将B部分添加到A部分,使用partA.addTargetPart)

你可以看到它的这一部分为自定义xml部分提供了itemID;这与您在下面设置的值相对应:

        DataBinding db = factory.createXpathsXpathDataBinding();
        db.setStoreItemID("something");

然后,通过您正在使用的方法设置XPath。