【问题标题】:Print values based on conditions根据条件打印值
【发布时间】: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


    【解决方案1】:

    您可以考虑迁移到 Saxon-JS (https://www.npmjs.com/package/saxon-js) 支持的 XPath 3.1,然后代码是

    require('saxon-js');
    
    let data = `<root>
    <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" />
    </root>`;
    
    console.log(SaxonJS.XPath.evaluate(`parse-xml($data)//isoColumns!(@LABEL, if (@TXTHEAD) then @TXTHEAD || codepoints-to-string(10) else ()) => string-join(codepoints-to-string(10))`, null, { params : { data: data }}));
    

    【讨论】:

      【解决方案2】:

      如果你无法访问 xpath 3.1,你可以试试这个:

      let th = xpath.select("//isoColumns ", root);
      for (let t of th) { 
          label = xpath.select('./@LABEL',t);
          thead = xpath.select('./@TXTHEAD',t);
          out = (thead.length>0) ? label[0].nodeValue+"\r\n"+thead[0].nodeValue+"\r\n" : label[0].nodeValue;
          console.log(out)
      };
      

      【讨论】:

        猜你喜欢
        • 2014-08-14
        • 1970-01-01
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        相关资源
        最近更新 更多