如何在 Indesign 中使用 XML 循环混合内容?

How to use XML looping over mixed content in Indesign?

这是我几个小时以来一直在努力解决的问题,尽管是以不同的非工作形式。

我有一个简单的 XML,我通过文件 > 导入 XML

导入
<?xml version="1.0" encoding="UTF-8"?>  
<doc>  
  <page>  
      <p id="1">  
          hello <test />  alien world <br /> from space  
      </p>  
      <p id="2">  
          hello <test /> another alien world <br /> from space  
      </p>  
  </page>  
</doc>  

目前我的目标相当简单,即遍历所有元素。这一直有效,直到我想遍历我的 p 标签中的(混合)内容。

// check version  
if (parseInt (app.version) > 4 && app.documents.length > 0){  
main();  
}  


function main() {  
// get active document  
var doc = app.activeDocument;  


// get xml that has been imported  
var xmlDocument = doc.xmlElements[0];  


// get page elements  
const page_elements = xmlDocument.evaluateXPathExpression('/doc/page')  


// iterate over page elements  
for(var x = 0; x < page_elements.length; x++) {  
   // within each page element look for p elements  
   const p_elements = page_elements[x].evaluateXPathExpression('./p');  

   for(var y = 0; y < p_elements.length; y++) {  

       var child_elements = p_elements[y].evaluateXPathExpression('./node()');  

       for (var z = 0; z < child_elements.length; z++) {  
         $.writeln(child_elements[z].markupTag.name);  
         $.writeln(child_elements[z].contents);  
       }  
   }  
}  
} 

问题是似乎没有记住子项的顺序。

根据扩展工具包,输出是 "p hello alien world from space test br" 而它应该是 "hello test alien world br from space".

我以此处提供的文档 (http://jongware.mit.edu/idcs4js/index_XML%20Suite.html) 为基础,包括 XmlElements 或 XmlItems 的使用,但没有普遍适用:-(

我现在考虑的一个可行的替代方案是通过 javascript 读取 xml 文件,从该字符串创建一个 XML 对象,然后从这里进一步。

你的输出是正确的,只是不是你所期望的。

p标签的内容就是这个标签中的所有文本,所以得到

1   tag name - p

2   tag contents  = hello alien world from space  

3   name of the next tag in the collection -> test

4   name of the next tag in the collection -> br

test 和 br 节点都没有任何内容 - 它们是空节点。

你可以尝试插入<test> some text</text>看看效果如何。结果应该是

p 
hello alien world from space 
test
some text 
br