我如何通过 xsltproc 将 xml 转换为 csv,其中包含来自 node1 的数据用于在同一级别输入的 node2 中的一个或多个条目

How can I convert xml to csv via xsltproc where data from node1 is included for one or many entries in node2 entered on the same level

下面是我的数据的模拟示例(以轻松演示层次结构)

client.xml

<?xml version="1.0" encoding="UTF-8"?>
<ns1:ClientMasterMessage xmlns:ns1="urn:pubcom:0127:PUB_I_PUN_PPM1.0">
    <ClientRecord>
        <GeneralData>
            <ObjectType>C</ObjectType>
            <ClientID>0100777879</ClientID>
            <ClientName>CLIENT_NAME1</ClientName>
            <ClientName2/>
            <ClientStreet>140 WEST 29TH STREET</ClientStreet>
            <ClientState>NY</ClientState>
            <ClientCountry>US</ClientCountry>
            <ClientStatus>02</ClientStatus>
        </GeneralData>
        <OrgaData>
            <CompanyCode>1A6</CompanyCode>
            <AgencyCode>1A62</AgencyCode>
            <SalesOrg>1A6B</SalesOrg>
            <Currency>USD</Currency>
            <JobAccountDir>02###273</JobAccountDir>
            <FinanceControl>02----31</FinanceControl>
        </OrgaData>
        <OrgaData>
            <CompanyCode>1A5</CompanyCode>
            <AgencyCode>1A55</AgencyCode>
            <SalesOrg>1A6A</SalesOrg>
            <Currency>USD</Currency>
            <JobAccountDir>02###650</JobAccountDir>
            <FinanceControl>02----27</FinanceControl>
        </OrgaData>
    </ClientRecord>
    <ClientRecord>
        <GeneralData>
            <ObjectType>C</ObjectType>
            <ClientID>0100061317</ClientID>
            <ClientName>CLIENT2</ClientName>
            <ClientName2/>
            <ClientStreet>4012 14TH STREET</ClientStreet>
            <ClientState>MS</ClientState>
            <ClientCountry>US</ClientCountry>
            <ClientStatus>06</ClientStatus>
        </GeneralData>
        <OrgaData>
            <CompanyCode>1A6</CompanyCode>
            <AgencyCode>1A67</AgencyCode>
            <SalesOrg>1A6C</SalesOrg>
            <Currency>USD</Currency>
            <JobAccountDir>00000000</JobAccountDir>
            <FinanceControl>00000000</FinanceControl>
        </OrgaData>
    </ClientRecord>
</ns1:ClientMasterMessage>

我正在尝试创建一个 .xsl 文件来写出以下内容

ObjectType|ClientID|ClientName|CompanyCode|AgencyCode
C|0100777879|CLIENT_NAME1|1A6|1A62
C|0100777879|CLIENT_NAME1|1A5|1A55
C|0100061317|CLIEN2|1A6|1A67

但是我的 xsl 文件

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="urn:pubcom:0127:PUB_I_PUN_PPM1.0">
<xsl:output method="text"  encoding="UTF-8" />

 <xsl:template match="/ns1:ClientMasterMessage">

    <!-- output the header row -->

      <xsl:text>ObjectType|ClientID|ClientName|CompanyCode|AgencyCode&#13;&#10;</xsl:text>
      <xsl:variable name="common">
        <xsl:text>"</xsl:text>
        <xsl:value-of select="ClientRecord/GeneralData/ObjectType"/>
        <xsl:text>"|"</xsl:text>
        <xsl:value-of select="ClientRecord/GeneralData/ClientID"/>
        <xsl:text>"|"</xsl:text>
        <xsl:value-of select="ClientRecord/GeneralData/ClientName"/>
        <xsl:text>"|"</xsl:text>
    </xsl:variable>
    <xsl:for-each select="ClientRecord/OrgaData">
                <xsl:value-of select="$common"/>
        <xsl:value-of select="CompanyCode"/>
        <xsl:text>"|"</xsl:text>
        <xsl:value-of select="AgencyCode"/>
        <xsl:text>"&#13;&#10;</xsl:text>

   </xsl:for-each>

  <!-- output newline  -->


<!-- chcunk -->
 </xsl:template>
</xsl:stylesheet>

生产

C|0100777879|CLIENT_NAME1|1A6|1A62
C|0100777879|CLIENT_NAME1|1A5|1A55
C|0100777879|CLIENT_NAME1|1A6|1A67

我采用的另一种方法

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="urn:pubcom:0127:PUB_I_PUN_PPM1.0">
<xsl:output method="text"  encoding="UTF-8" />

<xsl:template match="/ns1:ClientMasterMessage">
<ns1:ClientMasterMessage>
<xsl:text>OjbectType|ClientID|ClientName|CompanyCode|AgencyCode</xsl:text>
<xsl:text>"&#13;&#10;</xsl:text>

<xsl:for-each select="ClientRecord">
<ClientRecord>
<ObjectType>
<xsl:value-of   select="./GeneralData/ObjectType"/>
</ObjectType>
<xsl:text>"|"</xsl:text>
<ClientID>
<xsl:value-of   select="./GeneralData/ClientID"/>
</ClientID>
<xsl:text>"|"</xsl:text>
<ClientName>
<xsl:value-of   select="./GeneralData/ClientName"/>
</ClientName>
<xsl:text>"|"</xsl:text>



<xsl:text>"|"</xsl:text>
<CompanyCode>
<xsl:value-of   select="./OrgaData/CompanyCode"/>
</CompanyCode>
<xsl:text>"|"</xsl:text>
<AgencyCode>
<xsl:value-of   select="./OrgaData/AgencyCode"/>
</AgencyCode>
<xsl:text>"&#13;&#10;</xsl:text>
</ClientRecord>
</xsl:for-each>
</ns1:ClientMasterMessage>
</xsl:template>
</xsl:stylesheet>

产生了两行

ObjectType|ClientID|ClientName|CompanyCode|AgencyCode
C|0100777879|CLIENT_NAME1|1A5|1A55
C|0100061317|CLIEN2|1A6|1A67

有没有办法为给定 ClientRecord 的每个 OrgaData 条目重复 GeneralData?还是 value-of 语句有固有的局限性?

欢迎就如何最好地为这只小猫剥皮提出任何建议。此练习的输出将成为非规范化 table.

的输入

您显示的输出可以使用:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="urn:pubcom:0127:PUB_I_PUN_PPM1.0">
<xsl:output method="text" encoding="UTF-8" />

<xsl:template match="/ns1:ClientMasterMessage">
    <!-- header row -->
    <xsl:text>ObjectType|ClientID|ClientName|CompanyCode|AgencyCode&#13;&#10;</xsl:text>
    <!-- general data -->
    <xsl:for-each select="ClientRecord">
        <xsl:variable name="common">
            <xsl:value-of select="GeneralData/ObjectType"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="GeneralData/ClientID"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="GeneralData/ClientName"/>
            <xsl:text>|</xsl:text>
        </xsl:variable>
        <!-- output -->
        <xsl:for-each select="OrgaData">
            <xsl:value-of select="$common"/>
            <xsl:value-of select="CompanyCode"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="AgencyCode"/>
            <xsl:text>&#13;&#10;</xsl:text>
       </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>