需要DXL代码将属性行排列到表中(将DOORS数据转换为LaTeX源)

时间:2019-07-15 13:40:31

标签: ibm-doors

我有一个DXL脚本,它将DOORS列中的所有数据解析为与LaTeX兼容的文本源文件。我不知道如何将某些数据重新排序为兼容tabular的格式。有问题的属性是到参考DOORS模块的DXL链接,因此每个单元格中的每个链接只有一行(由换行分隔)。目前,我遍历每个对象(行)的所有列,并附带代码片段(完整脚本的一部分)

   for col in doorsModule do {      
      var_name = title( col )    
      if( ! main( col ) && search( regexp "Absolute Number", var_name, 0 ) == false )
      { 
//  oss is my output stream variable 
        if ( length(text(col, obj) ) > 0 )
        {
             oss << "\\textbf{";
             oss << var_name;  // still the column title here    
                oss <<  "}\t"    
             var_name = text( col, obj );
             oss << var_name; 
             oss << "\n\n"; 
             c++;
        }
      }               
   }

单元格内容的示例,其中我分别将列名解析为粗体并在收集单元格内容之前对其进行了收集。所有四行都是单个单元格的内容。

\textbf{LinkedItemName}
DISTANCE
MinSpeed
MaxSpeed
Time

\textbf{Unit}
m
km/h
km/h
minutes

\textbf{Driver1}
100
30
80
20

\textbf{Driver2}
50
20
60
10

\textbf{Driver3}
60
30
60
30

我想做的是重新排列数据,以便我可以将表的源代码编写为:

\textbf{LinkedItemName} & \textbf{Unit} & \textbf{Driver1} & \textbf{Driver2} & \textbf{Driver3} \\
DISTANCE & m & 100 & 50 & 60 \\
MinSpeed & km/h & 30 & 20 & 30 \\
MaxSpeed & km/h & 80 & 60 & 60 \\
Time & minutes & 20 & 10 & 30 \\

我事先知道我正在“收集”的确切属性名称。我无法弄清楚如何处理从每个单元格(正则表达式或其他)返回的数据来创建所需的最终输出。我猜想(在DXL中)一些正则表达式代码可能能够将单元格中每一行的内容分配给一系列变量,但还不太清楚。

1 个答案:

答案 0 :(得分:0)

正则表达式和字符串汇编的组合似乎有效。这是一些示例代码(其中一些直接来自《 DOORS DXL参考手册》)

int idx = 0
Array thewords = create(1,1)
Array  thelen = create(1,1)
Regexp getaline = regexp2 ".*"
// matches any character except newline
string txt1 = "line 1\nline two\nline three\n"
// 3 line string
while (!null txt1 && getaline txt1) {
    int ilen = length(txt1[match 0])
    print "ilen is " ilen "\n"
    put(thelen, ilen, idx, 0)
    putString(thewords,txt1[match 0],0,idx)
    idx ++ 
    // match 0 is whole of match
    txt1 = txt1[end 0 + 2:] // move past newline
}
int jj
// initialize to simplify adding the "&"
int lenone = (int get(thelen,0,0) )
string foo = (string get(thewords, 0, 0,lenone ) )
int lenout
for (jj = 1; jj < idx; jj++) {
    lenout = (int get(thelen,jj,0) )
    foo = foo "&" (string get(thewords, 0, jj,lenout ) )
}
foo = foo "\\\\" 

// foo is now  "line 1&line two&line three\\ " (without quotes) as LaTeX wants