如何在 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
这是我几个小时以来一直在努力解决的问题,尽管是以不同的非工作形式。
我有一个简单的 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