如何将数据从两个 SAS 数据集正确导出到一个 XML 数据文件?

如何解决如何将数据从两个 SAS 数据集正确导出到一个 XML 数据文件?

将多个(两个或多个)SAS 数据集(dataset1、dataset2)导出到一个 XML 数据文件并同时引用 XMLMap 中的不同表的正确方法是什么?

执行以下操作时效果很好:

filename xmlout 'path\to\file\want.xml';
libname xmlout xmlv2 xmltype=xmlmap xmlmap='path\to\file\XMLmap.map';

data xmlout.dim;
set work.have_dim;
run;

我从另一个 SAS 表中获取数据以在标题中导出(ID 和时间如 .map 中所示)。 然后我会修改 .map :

<OUTPUT> 
   <TABLEREF name="dim" /> 
   <TABLEREF name="header" />
</OUTPUT>

并执行以下代码:

data xmlout.header;
    set work.have_header;
run;

但是,我无法将 TABLEREF 添加到标题表中,因为它在文档中指定:TABLEREF= specifies the name of the table in the XMLMap to be exported. The name must be unique in the XMLMap definition,and the name must be a valid SAS name,which can be up to 32 characters. (cf. XML LIBNAME Engine )

所以我的问题是,如果我不能使用不同的 TABLEREF ,我如何将这两个 SAS 表导出到同一个 XML 文件中? 在某些时候,我想使用一个数据步骤,我只是将两个表放在一起,并且在 .map 中只使用一个 TABLEREF,如下所示:

data aggregated;
   set have_dim have_header;
run;

但是,如何将某些变量重定向到 header 表(ID 和时间)以及 XML 输出中 dim 表中的其他变量?

所需的 XML output 将是:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:message xmlns:ns2="http://www.someurl/common/vo/message" xmlns:ns3="http://www.someurl/common/vo/cube">
  <ns2:header>
      <ns2:ID>1234</ns2:ID> 
      <ns2:time>2021-01-19T09:20:47</ns2:time> <!-- the time of the day --> 
  </ns2:header>
  <ns2:content>
      <ns2:dataSegment id="OBSERVATION">
            <ns2:cube id="ID_CODE">
                <ns3:obs>
                    <ns3:dim name="CODE" value="ABC123" />
                    <ns3:dim name="VAR" value="VAR1"/>
                    <ns3:dim name="VALUE" value="Y"/>       
                    <ns3:dim name="DATE" value="2021-01-01T00:00:00" />
                </ns3:obs>
            </ns2:cube>
            <ns2:cube id="ID_CODE">
                <ns3:obs>
                    <ns3:dim name="CODE" value="DEF456" />
                    <ns3:dim name="VAR" value="VAR2"/>
                    <ns3:dim name="VALUE" value="N"/>       
                    <ns3:dim name="DATE" value="2021-01-01T00:00:00" />
                </ns3:obs>
            </ns2:cube>
        </ns2:dataSegment>
  </ns2:content>
</ns2:message>

为了举例,我只显示了 2 个观察结果。尽管如此,可能会有超过 100 万个观测值。

编辑:可重现的示例:

SAS Code

data have_header;
ID = 1234;
time = datetime();
run;

data have_dim;
infile datalines delimiter=",";
input CODE :$8. VAR :$8. VALUE $1. DATE:datetime20.;
format DATE datetime20.;
datalines;
ABC1,VAR1,Y,31DEC2020:00:00:00
ABC2,VAR2,N,31DEC2020:00:00:00
;
run;

filename dim'path\to\file\dim.xml';
libname dim xmlv2 xmltype=xmlmap xmlmap='path\to\file\map_dim.map';

data dim.dim;
set have_dim;
run;

filename header 'path\to\file\header.xml';
libname header xmlv2 xmltype=xmlmap xmlmap='path\to\file\map_header.map';

data header.header;
set have_header;
run;

libname dim clear;
libname header clear;

*** COMBINE ALL XML FILES;
proc xsl 
   in  = "path\to\file\header.xml"
   xsl = "path\to\file\script.xsl"
   out = "path\to\file\final_output.xml";
run;

XML.map 表示暗淡:

<?xml version="1.0" encoding="UTF-8"?>
<!-- ############################################################ -->
<!-- 2021-01-19T08:41:21 -->
<!-- SAS XML Libname Engine Map -->
<!-- Generated by XML Mapper,904300.0.0.20150204190000_v940m3 -->
<!-- ############################################################ -->
<!-- ###  Validation report                                   ### -->
<!-- ############################################################ -->
<!-- XMLMap validation completed successfully. -->
<!-- ############################################################ -->
<SXLEMAP name="AUTO_GEN" version="2.1">

    <NAMESPACES count="2">
        <NS id="1" prefix="ns2">http://www.someurl/common/vo/message</NS>
        <NS id="2" prefix="ns3">http://www.someurl/common/vo/cube</NS>
    </NAMESPACES>
    
    <OUTPUT>
        <TABLEREF name="dim" />
    </OUTPUT>
    
    <!-- ############################################################ -->
    <TABLE description="message" name="message">
        <TABLE-PATH syntax="XPathENR">/{1}message</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="header" name="header">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}header</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="header_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}header</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>
        
    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="content" name="content">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="content_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="dataSegment" name="dataSegment">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</TABLE-PATH>

        <COLUMN class="ORDINAL" name="content_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="dataSegment_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="dataSegment_id">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/@id</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>11</LENGTH>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="cube" name="cube">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</TABLE-PATH>

        <COLUMN class="ORDINAL" name="dataSegment_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="cube_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="cube_id">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/@id</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>27</LENGTH>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="obs" name="obs">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</TABLE-PATH>

        <COLUMN class="ORDINAL" name="cube_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="obs_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="dim" name="dim">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim</TABLE-PATH>

        <COLUMN class="ORDINAL" name="obs_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="dim_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>
        
        <COLUMN name="CODE">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim/CODE</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>8</LENGTH>
        </COLUMN>
        
        <COLUMN name="VAR">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim/VAR1</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>8</LENGTH>
        </COLUMN>

        <COLUMN name="VALUE">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim/VALUE</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>1</LENGTH>
        </COLUMN>
        
        <COLUMN name="DATE">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim/DATE</PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>datetime</DATATYPE>
            <FORMAT width="10">IS8601DA</FORMAT>
            <INFORMAT width="10">IS8601DA</INFORMAT>
        </COLUMN>

    </TABLE>

</SXLEMAP>

XML.map 用于标题:

<?xml version="1.0" encoding="UTF-8"?>
<!-- ############################################################ -->
<!-- 2021-01-19T08:41:21 -->
<!-- SAS XML Libname Engine Map -->
<!-- Generated by XML Mapper,904300.0.0.20150204190000_v940m3 -->
<!-- ############################################################ -->
<!-- ###  Validation report                                   ### -->
<!-- ############################################################ -->
<!-- XMLMap validation completed successfully. -->
<!-- ############################################################ -->
<SXLEMAP name="AUTO_GEN" version="2.1">

    <NAMESPACES count="2">
        <NS id="1" prefix="ns2">http://www.someurl/common/vo/message</NS>
        <NS id="2" prefix="ns3">http://www.someurl/common/vo/cube</NS>
    </NAMESPACES>
    
    <OUTPUT>
        <TABLEREF name="header" />
    </OUTPUT>
    
    <!-- ############################################################ -->
    <TABLE description="message" name="message">
        <TABLE-PATH syntax="XPathENR">/{1}message</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="header" name="header">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}header</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="header_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}header</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="ID">
            <PATH syntax="XPathENR">/{1}message/{1}header/{1}ID</PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="time">
            <PATH syntax="XPathENR">/{1}message/{1}header/{1}time</PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>datetime</DATATYPE>
            <FORMAT width="19">IS8601DT</FORMAT>
            <INFORMAT width="19">IS8601DT</INFORMAT>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="content" name="content">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content</TABLE-PATH>

        <COLUMN class="ORDINAL" name="message_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="content_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="dataSegment" name="dataSegment">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</TABLE-PATH>

        <COLUMN class="ORDINAL" name="content_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="dataSegment_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="dataSegment_id">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/@id</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>11</LENGTH>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="cube" name="cube">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</TABLE-PATH>

        <COLUMN class="ORDINAL" name="dataSegment_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="cube_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="cube_id">
            <PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/@id</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>27</LENGTH>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="obs" name="obs">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</TABLE-PATH>

        <COLUMN class="ORDINAL" name="cube_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="obs_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="dim" name="dim">
        <TABLE-PATH syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim</TABLE-PATH>

        <COLUMN class="ORDINAL" name="obs_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN class="ORDINAL" name="dim_ORDINAL">
            <INCREMENT-PATH beginend="BEGIN" syntax="XPathENR">/{1}message/{1}content/{1}dataSegment/{1}cube/{2}obs/{2}dim</INCREMENT-PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

    </TABLE>

</SXLEMAP>

XML output for dim (dim.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!--
          SAS XML Libname Engine (SAS92XML)
          SAS XMLMap Generated Output
          Version 9.04.01M3P06242015
          Created 2021-01-19T09:20:47
      -->
<ns2:message xmlns:ns2="http://www.someurl/common/vo/message">
   <ns2:content>
      <ns2:dataSegment>
         <ns2:cube>
            <ns3:obs xmlns:ns3="http://www.someurl/common/vo/cube">
               <ns3:dim>
                  <CODE>ABC1</CODE>
                  <VAR1>VAR1</VAR1>
                  <VALUE>Y</VALUE>
                  <DATE>2020-12-31T00:00:00</DATE>
               </ns3:dim>
               <ns3:dim>
                  <CODE>ABC2</CODE>
                  <VAR1>VAR2</VAR1>
                  <VALUE>N</VALUE>
                  <DATE>2020-12-31T00:00:00</DATE>
               </ns3:dim>
            </ns3:obs>
         </ns2:cube>
      </ns2:dataSegment>
   </ns2:content>
</ns2:message>

XML output for header (header.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!--
          SAS XML Libname Engine (SAS92XML)
          SAS XMLMap Generated Output
          Version 9.04.01M3P06242015
          Created 2021-01-19T09:39:44
      -->
<ns2:message xmlns:ns2="http://www.someurl/common/vo/message">
   <ns2:header>
      <ns2:ID>1234</ns2:ID>
      <ns2:time>2021-01-19T09:39:44</ns2:time>
   </ns2:header>
</ns2:message>

所需的最终 XML 输出

<?xml version="1.0" encoding="UTF-8"?>
<ns2:message xmlns:ns2="http://www.someurl/common/vo/message" xmlns:ns3="http://www.someurl/common/vo/cube">
  <ns2:header>
      <ns2:ID>1234</ns2:ID> 
      <ns2:time>2021-01-19T09:20:47</ns2:time> <!-- the time of the day --> 
  </ns2:header>
  <ns2:content>
      <ns2:dataSegment id="OBSERVATION">
            <ns2:cube id="ID_CODE">
                <ns3:obs>
                    <ns3:dim name="CODE" value="ABC1" />
                    <ns3:dim name="VAR" value="VAR1"/>
                    <ns3:dim name="VALUE" value="Y"/>       
                    <ns3:dim name="DATE" value="2020-12-31T00:00:00" />
                </ns3:obs>
            </ns2:cube>
            <ns2:cube id="ID_CODE">
                <ns3:obs>
                    <ns3:dim name="CODE" value="ABC2" />
                    <ns3:dim name="VAR" value="VAR2"/>
                    <ns3:dim name="VALUE" value="N"/>       
                    <ns3:dim name="DATE" value="2020-12-31T00:00:00" />
                </ns3:obs>
            </ns2:cube>
        </ns2:dataSegment>
  </ns2:content>
</ns2:message>

将 proc xls 与 Parfait 的 script.xls 结合使用时的结果

<?xml version="1.0" encoding="UTF-8"?><ns2:message xmlns:ns2="http://www.someurl/common/vo/message"><ns2:header>
<ns2:ID>1234</ns2:ID>
<ns2:time>2021-01-19T09:39:44</ns2:time>
</ns2:header></ns2:message>

解决方法

考虑 XSLT,这是一种专门用于转换 XML 文件的专用语言,例如从不同的文档进行组合。 SAS 可以使用 proc xsl 运行 XSLT 1.0 甚至 2.0。

然而,您实际上需要两个 XSLT 转换,因为您想要的输出并不完全是两个 XML 文件的堆栈,即 dim.xml 中的元素被迁移到属性。

XSLT 1 (另存为 .xsl 文件,一个特殊的 .xml 文件)

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                             xmlns:ns2="http://www.someurl/common/vo/message"
                             xmlns:ns3="http://www.someurl/common/vo/cube"> 
  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>
    
  <xsl:template match="/ns2:message">
    <ns2:message xmlns:ns2="http://www.someurl/common/vo/message" xmlns:ns3="http://www.someurl/common/vo/cube"> 
         <xsl:apply-templates select="ns2:content"/>
    </ns2:message>
  </xsl:template> 
 
   <xsl:template match="ns2:content">
    <xsl:copy> 
         <xsl:apply-templates select="ns2:dataSegment"/>
    </xsl:copy>
  </xsl:template> 
  
  <xsl:template match="ns2:dataSegment">
    <xsl:copy> 
         <xsl:attribute name="id">OBSERVATION</xsl:attribute>
         <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template> 
  
  <xsl:template match="ns2:cube|ns3:obs">
     <xsl:apply-templates select="*"/>
  </xsl:template> 
  
  <xsl:template match="ns3:dim">
    <ns2:cube id="ID_CODE">
      <ns3:obs> 
         <xsl:for-each select="*">  
             <ns3:dim> 
                 <xsl:attribute name="name">
                    <xsl:value-of select="name()"/>
                 </xsl:attribute>
                 <xsl:attribute name="value">
                    <xsl:value-of select="text()"/>
                 </xsl:attribute>
            </ns3:dim>
         </xsl:for-each>
      </ns3:obs>     
     </ns2:cube>
  </xsl:template> 
  
</xsl:transform>

XSLT 2 (另存为 .xsl 文件;使用带有 file:// 关键字的绝对路径引用)

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                             xmlns:ns2="http://www.someurl/common/vo/message"> 
  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>
  
  <xsl:template match="/ns2:message">
    <ns2:message xmlns:ns2="http://www.someurl/common/vo/message" xmlns:ns3="http://www.someurl/common/vo/cube"> 
         <!-- COPY CURRENT DATA -->
         <xsl:copy-of select="*"/>

         <!-- COMBINE ALL DATA FROM NEW dim.xml -->
         <xsl:copy-of select="document('file://absolute/path/to/new_dim.xml')/ns2:message/*" />
    </ns2:message>
  </xsl:template> 
  
</xsl:transform>

SAS (使用宏输出多个文件)

*** OUTPUT INDIVIDUAL XML FILES;
%macro output_xmls(dset);
   filename xmlout "path\to\file\&dset..xml";
   libname xmlout xmlv2 xmltype=xmlmap xmlmap='path\to\file\XMLmap.map';

   data xmlout.&dset;
      set work.&dset;
   run;

   libname xmlout clear;
%mend output_xmls;

%output_xmls(header);
%output_xmls(dim);


*** TRANSFORM RAW dim.xml;
proc xsl 
   in  = "path\to\file\dim.xml"
   xsl = "path\to\file\script_1.xsl"
   out = "path\to\file\new_dim.xml";
run;

*** COMBINE header.xml and new_dim.xml FILES;
proc xsl 
   in  = "path\to\file\header.xml"
   xsl = "path\to\file\script_2.xsl"
   out = "path\to\file\final.xml";
run;

输出

<?xml version="1.0" encoding="UTF-8"?>
<ns2:message xmlns:ns2="http://www.someurl/common/vo/message"
             xmlns:ns3="http://www.someurl/common/vo/cube">
   <ns2:header>
      <ns2:ID>1234</ns2:ID>
      <ns2:time>2021-01-19T09:39:44</ns2:time>
   </ns2:header>
   <ns2:content>
      <ns2:dataSegment id="OBSERVATION">
         <ns2:cube id="ID_CODE">
            <ns3:obs>
               <ns3:dim name="CODE" value="ABC1"/>
               <ns3:dim name="VAR1" value="VAR1"/>
               <ns3:dim name="VALUE" value="Y"/>
               <ns3:dim name="DATE" value="2020-12-31T00:00:00"/>
            </ns3:obs>
         </ns2:cube>
         <ns2:cube id="ID_CODE">
            <ns3:obs>
               <ns3:dim name="CODE" value="ABC2"/>
               <ns3:dim name="VAR1" value="VAR2"/>
               <ns3:dim name="VALUE" value="N"/>
               <ns3:dim name="DATE" value="2020-12-31T00:00:00"/>
            </ns3:obs>
         </ns2:cube>
      </ns2:dataSegment>
   </ns2:content>
</ns2:message>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res