我如何通过 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 </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>" </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>" </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>" </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 </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> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
下面是我的数据的模拟示例(以轻松演示层次结构)
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 </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>" </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>" </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>" </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 </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> </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>