【发布时间】:2021-05-07 22:57:30
【问题描述】:
我有以下xml
<isoColumns TYPE="time" ISOFID="175" LABEL="Time" INFORM="Y" INQUERY="N" CATEGORY="0" ISOCID="251330" LINEFEED="X"/>
<isoColumns TYPE="date" ISOFID="175" COLNAME="DATE_OF_LASTCHANGE" LABEL="Date of last change" />
<isoColumns TYPE="date" ISOFID="175" LABEL="Date for SP" ISOCID="251325" TXTHEAD="Baseline data"/>
<isoColumns TYPE="date" ISOFID="175" LABEL="Date of report" INFORM="Y" INQUERY="N" CATEGORY="2" ISOCID="251331" />
<isoColumns TYPE="time" ISOFID="175" NORDERBY="11" NULLABLE="Y" LABEL="Time" ISOCID="251179" />
我想从每一行打印LABEL 属性,但如果当前行也有一个名为TXTHEAD 的属性,我也想打印它(加上换行符)。在上面的 XML 中,只有第 3 列有属性TXTHEAD
所以它应该打印的是(注意 TXTHEAD 属性值后面的新行):
Time
Date of last change
Date for SP
Baseline data (This is the TXTHEAD attribute)
Date of report
Time
这是我的尝试。显然我的方法是错误的。我想表达如下:
“打印当前行/isoColumn的标签属性值,但是如果它有TXTHEAD属性,也打印,并进行换行”
var parser = new xmlDom.DOMParser();
var serializer = new xmlDom.XMLSerializer();
var root = parser.parseFromString(data, 'text/xml');
var obj = xpath.select("//isoForms[@ISOFID='" + isoFID + "']", root);
for (let n of obj) {
let labs = xpath.select("isoColumns[@CATEGORY[.!=0 and .!=8 and .!=10] and (not(@INPDF) or INPDF='Y')]/@LABEL", n);
for(let lCount=0; lCount<labs.length; lCount++){
let tHead = xpath.select("../../*[@TXTHEAD]/@TXTHEAD", labs[lCount]);
if(tHead.length > 0) {
//console.log("THVal: "+tHead[0].value);
let bLine = xpath.select("../../@TXTHEAD", tHead[lCount]);
通过我尝试过的解决方案,我遇到了这段代码的问题:
let tHead = xpath.select("../../*[@TXTHEAD]/@TXTHEAD", labs[lCount]);
tHead 将是一个小于labs 的列表,所以我得到一个错误。因此我在想,如果我可以在与LABEL 属性相同的运行中打印TXTHEAD 属性,那么我就不必将TXTHEAD 存储在列表中。
【问题讨论】:
标签: javascript node.js xml xpath