替换SAS宏变量中的引号

时间:2010-11-11 14:05:54

标签: xml sas

考虑以下sas代码片段:

%macro temp(querystr=);
  filename request temp;

  data _null_;
    file request;

    put "<string>&querystr</string>";
  run;
%mend temp;

%temp(querystr="term 1" and "term2");

请注意,这段代码将无法编译,因为当编译器替换数据步骤中的querystr时,querystr中的第一个引号将关闭put语句的起始引号。

我想屏蔽查询字符串中的引号,将其转换为有效的xml片段,如:

<string>&quot;term 1&quot; and &quot;term 2&quot;</string>

有没有办法通过正确屏蔽引号将上述行输出到文件?我尝试将%sysfunc(TranWrd())函数与%nrbquote()等掩码函数结合使用,但到目前为止我还没有找到可行的解决方案。任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:3)

在datastep中添加一个带“quot”选项的htmlencode,并使用%bquote来屏蔽引号直到宏执行。

%macro temp(querystr=);

  filename request temp;

  data _null_;

    file request;

    string = cats('<string>',htmlencode("&querystr",' quot'),'</string>');

    put string;

  run;

%mend temp;

%temp(querystr=%bquote("term 1" and "term2"));

答案 1 :(得分:2)

只要双引号是平衡的,就可以调用宏。因此,您不需要强制宏用户宏引用参数。您的宏可以为他们执行此操作,如下所示。

   %macro temp(querystr=);
     filename request temp;
     data _null_;
       file request;
       s = catx(htmlencode("%superq(querystr)","quot"),"<string>","</string>");
       l = length(s);
       put s $varying. l;
     run;
   %mend temp;

   %temp(querystr="term 1" and "term2");

   /* check */
   data _null_;
     infile request;
     input;
     put _infile_;
   run;
   /* on log
   <string>&quot;term 1&quot; and &quot;term2&quot;</string>
   */ 

答案 2 :(得分:1)

尝试以下方法:

options mcompilenote=all;
%macro temp(querystr=); 
  filename request temp; 

  data _null_; 
    file request; 
    querystr=symget('querystr');
    querystr=htmlencode(querystr,'quot');
    *putlog querystr $;
    string="<string>"!!trim(querystr)!!"</string>";
    put string $200.;
    *put "<string>&querystr</string>"; 
  run; 
%mend temp; 

%temp(querystr="term 1" and "term2"); 

答案 3 :(得分:-2)

只需使用put'foo';代替:

%macro temp(querystr=);
  filename request temp;

  data _null_;
    file request;

    put '<string>&querystr</string>';
  run;
%mend temp;

%temp(querystr="term 1" and "term2");