我对此有点挣扎,并将我的问题重新构思到了必需品上。我有一个脚本,通过ajax从SQL数据库中检索XML提要。我无法真正构建它是如何生成的,它来自我无法改变的存储过程。 XML中有一些重复的节点。我需要做的是重组这个,这样我就可以在页面上输出不同的数据视图。
以下是数据:
<tcm:ListPublishItems xmlns:tcm="http://xxxx">
<tcm:PublicationTarget xmlns:tcm="http://www.tridion.com/ContentManager/5.0" ID="tcm:0-2-65537" Title="ProdPreview">
<tcm:Page ID="tcm:17-999999-64" Title="testpage" Path="\usweb\wr\aps\jtest" Icon="T64LRE0">
</tcm:Page>
<tcm:Page ID="tcm:17-222222-64" Title="singletest" Path="\usweb\wr\aps\jtest\single" Icon="T64LRE0">
</tcm:Page>
</tcm:PublicationTarget>
<tcm:PublicationTarget xmlns:tcm="http://xxxx" ID="tcm:0-65-65537" Title="TestPreview">
<tcm:Page ID="tcm:17-999999-64" Title="testpage" Path="usweb\wr\aps\jtest" Icon="T64LRE0">
</tcm:Page>
</tcm:PublicationTarget>
在此示例中,有2个PublicationTarget节点,一个有2个页面,1个有一个页面。在第二个节点中,页面与第一个节点是同一页面。我需要做的是输出内容,使其以页面为中心而不是PublicationTarget centreit
即 Page tcm:17-999999-64 - PubTargets - ProdPreview,TestPreview Page tcm:17-222222-64 - PubTargets - ProdPreivew
我的代码
function parseITPData(data){
var xmlDoc = $j.parseXML(data.d);
var $xml = $j(xmlDoc);
var items = $xml.find("Page");
var newHtml = ""
var storage = {};
var pTCM,targetType,title,path;
for (var i =0; i<items.length; i++) {
pTCM = items[i].getAttribute("ID");
targetType = items[i].parentNode.getAttribute("Title");
path = items[i].getAttribute("Path");
title = items[i].getAttribute("Title");
if ( pTCM in storage ) {
storage[pTCM].push(targetType);
console.log ("nope");
}
else {
storage[pTCM] = [];
storage[pTCM].push(targetType);
}
}
for (var prop in storage) {
if (storage.hasOwnProperty(prop)){ }
newHtml += "<div style='margin:5px; padding:5px; border-bottom: 1px dotted #9C9C9C; font-size:95%'><div> <b>Page\/Component Published:</b> "+ title +
" </div><div class='itpPath'>Path: "+ path +
"</div><div class='itpTCM'>Item URI: " + "<input type='text' value=" + prop + " readonly>" +
"<input type='button' value='View Page' onclick='window.open(\"/WebUI/item.aspx?tcm=64#id=" + prop + "\")'> "+
"</div><div class='itpPub'> Publication Target: " + storage[prop].join(', ') +
"</div></div>";
}
$j("#results").html(newHtml);
$j("#loadingImage").hide();
}
不幸的是,仅报告正确的ID和发布分组,但只给出路径和标题的循环中的最后一项。
答案 0 :(得分:0)
只需让您的存储对象更深一点,它就像是:
{
"PcTmVal_1": {
"targetType": [
"ProdPreview",
"TestPreview"
],
"title": "testpage",
"path": "somepath/url/"
},
"PcTmVal_2": {
"targetType": [
"ProdPreview",
"TestPreview"
],
"title": "anotherTitle",
"path": "anotherpath/url/"
}
}
你的第一个循环看起来像:
if (storage[pTCM] === undefined) {
storage[pTCM] = {
targetType: [],
title: title,
path: path
}
}
storage[pTCM].targetType.push(targetType);
然后在第二个循环中替换
+ title +
与
+ storage[prop].title +
而不是storage[prop].join(', ')
,它将是storage[prop].targetType.join(', ')