我无法使用XSLT将XML文件拆分为多个文件。
我尝试根据附加的XSLT代码分割文件。我已经成功地分割了文件。但是,我无法弄清楚如何复制文件并为原始文件中的每个文件创建一个文件。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xml" indent="yes" name="xml"/>
<xsl:template match="/">
<xsl:for-each select="//FlightGroup">
<xsl:variable
name="filehandle"
select="//Info/Campaign/CampaignNumber"/>
<xsl:variable
name="FlightGroupId"
select="FlightGroup-id"
/>
<xsl:variable name="filename"
select="concat('file:///c:/Temp/',$filehandle,'_',$FlightGroupId,'.xml')" />
<xsl:value-of select="$filename" /> <!-- Creating -->
<xsl:result-document href="{$filename}" format="xml">
<Data>
<filename><xsl:value-of select = "concat($filehandle, '_', $FlightGroupId)"/></filename>
<xsl:copy-of select = "//OrderCustomers" />
<xsl:copy-of select = "//Campaign"/>
<xsl:copy-of select = "." />
</Data>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我需要能够为每个排班组生成一个文件,其余文件与原始文件重复。
例如:
源文件:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Info>
<OrderCustomers>
<OrderCustomer>
<IsPrimaryOrderer>true</IsPrimaryOrderer>
<IsPrimaryPayor>true</IsPrimaryPayor>
<Customer>
<account-number>20007658</account-number>
<accountid>7659</accountid>
<Name1>DIGITAL TEST ACCOUNT</Name1>
<Phone>0000000000</Phone>
<Type-id>2</Type-id>
<Type>Commercial</Type>
<Company-id>1</Company-id>
<Company>Company1</Company>
<Address>
<Addr1>123 Main</Addr1>
<City>Anytown</City>
<Postal-Code>99999</Postal-Code>
<Country-id>1</Country-id>
<Country>USA</Country>
<State-id>113</State-id>
<State>TX</State>
</Address>
<PrimarySalesRep>Rep1</PrimarySalesRep>
<Category>Local</Category>
<PaymentMethod-id>4</PaymentMethod-id>
<PaymentMethod>Credit Card</PaymentMethod>
</Customer>
</OrderCustomer>
</OrderCustomers>
<ad-ordered-by>test</ad-ordered-by>
<publication-code>Y</publication-code>
<pagination-code>N</pagination-code>
<ProductionCode>N</ProductionCode>
<ad-sold-by-id>113</ad-sold-by-id>
<ad-sold-by>Rep1</ad-sold-by>
<ad-sold-by-name>National</ad-sold-by-name>
<ad-order-taker-id>15</ad-order-taker-id>
<ad-order-taker>jsmith</ad-order-taker>
<CreateDate>07022019 13:50:31</CreateDate>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>jsmith</LastEditUser>
<order-number>00000994</order-number>
<price>10.00</price>
<company-id>1</company-id>
<company>Company1</company>
<CreationDate>070220191350</CreationDate>
<Campaign>
<CampaignId>205</CampaignId>
<CampaignNumber>00994-01</CampaignNumber>
<Name>DIGITAL TEST ACCOUNT01</Name>
<Type-id>1</Type-id>
<Type>Banner</Type>
<Category-id>1</Category-id>
<Category>Standard</Category>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Quantity>1000</Quantity>
<Price>10.00</Price>
<CampaignUnit>
<Id>7</Id>
<Name>300x250</Name>
<Width>300</Width>
<Height>250</Height>
</CampaignUnit>
<CampaignUnit>
<Id>6</Id>
<Name>728x90</Name>
<Width>728</Width>
<Height>90</Height>
</CampaignUnit>
<FlightGroup>
<Name>Group1</Name>
<FlightGroup-id>296</FlightGroup-id>
<CampaignUnit-id>7</CampaignUnit-id>
<CampaignUnit>300x250</CampaignUnit>
<Quantity>500</Quantity>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Flight>
<Flight-id>666</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>3</Page-id>
<Page>ATF</Page>
<SiteURL>www.anysite.com</SiteURL>
<InvoicedAlreadyFlag>0</InvoicedAlreadyFlag>
<PublishedFlag>true</PublishedFlag>
<Price>2.50</Price>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26901" PublishedFlag="true">07072019</date>
<date Insertion-id="26902" PublishedFlag="true">07082019</date>
<date Insertion-id="26903" PublishedFlag="true">07092019</date>
<date Insertion-id="26904" PublishedFlag="true">07102019</date>
<date Insertion-id="26905" PublishedFlag="true">07112019</date>
</dates>
</Flight>
<Flight>
<Flight-id>667</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>4</Page-id>
<Page>BTF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26926" PublishedFlag="true">07072019</date>
<date Insertion-id="26927" PublishedFlag="true">07082019</date>
<date Insertion-id="26928" PublishedFlag="true">07092019</date>
<date Insertion-id="26929" PublishedFlag="true">07102019</date>
<date Insertion-id="26930" PublishedFlag="true">07112019</date>
</dates>
</Flight>
</FlightGroup>
<FlightGroup>
<Name>Group2</Name>
<FlightGroup-id>297</FlightGroup-id>
<CampaignUnit-id>6</CampaignUnit-id>
<CampaignUnit>728x90</CampaignUnit>
<Quantity>500</Quantity>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Flight>
<Flight-id>668</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>3</Page-id>
<Page>ATF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26951" PublishedFlag="true">07072019</date>
<date Insertion-id="26952" PublishedFlag="true">07082019</date>
<date Insertion-id="26953" PublishedFlag="true">07092019</date>
<date Insertion-id="26954" PublishedFlag="true">07102019</date>
<date Insertion-id="26955" PublishedFlag="true">07112019</date>
</dates>
</Flight>
<Flight>
<Flight-id>669</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>4</Page-id>
<Page>BTF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26976" PublishedFlag="true">07072019</date>
<date Insertion-id="26977" PublishedFlag="true">07082019</date>
<date Insertion-id="26978" PublishedFlag="true">07092019</date>
<date Insertion-id="26979" PublishedFlag="true">07102019</date>
<date Insertion-id="26980" PublishedFlag="true">07112019</date>
</dates>
</Flight>
</FlightGroup>
<FrequencyCap />
<AdServingId>3</AdServingId>
<AdServing>DFP</AdServing>
<CampaignViewTypeId>2</CampaignViewTypeId>
<CampaignViewType>Impressions</CampaignViewType>
<CreateDate>07022019 13:50:31</CreateDate>
<CreateUser>Rep1</CreateUser>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>Rep1</LastEditUser>
</Campaign>
<Company>
<ID>1</ID>
<COMPANYCODE>Company1</COMPANYCODE>
</Company>
</Info>
</Data>
文件#1-00994-01_296.xml
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Info>
<OrderCustomers>
<OrderCustomer>
<IsPrimaryOrderer>true</IsPrimaryOrderer>
<IsPrimaryPayor>true</IsPrimaryPayor>
<Customer>
<account-number>20007658</account-number>
<accountid>7659</accountid>
<Name1>DIGITAL TEST ACCOUNT</Name1>
<Phone>0000000000</Phone>
<Type-id>2</Type-id>
<Type>Commercial</Type>
<Company-id>1</Company-id>
<Company>Company1</Company>
<Address>
<Addr1>123 Main</Addr1>
<City>Anytown</City>
<Postal-Code>99999</Postal-Code>
<Country-id>1</Country-id>
<Country>USA</Country>
<State-id>113</State-id>
<State>TX</State>
</Address>
<PrimarySalesRep>Rep1</PrimarySalesRep>
<Category>Local</Category>
<PaymentMethod-id>4</PaymentMethod-id>
<PaymentMethod>Credit Card</PaymentMethod>
</Customer>
</OrderCustomer>
</OrderCustomers>
<ad-ordered-by>test</ad-ordered-by>
<publication-code>Y</publication-code>
<pagination-code>N</pagination-code>
<ProductionCode>N</ProductionCode>
<ad-sold-by-id>113</ad-sold-by-id>
<ad-sold-by>Rep1</ad-sold-by>
<ad-sold-by-name>National</ad-sold-by-name>
<ad-order-taker-id>15</ad-order-taker-id>
<ad-order-taker>jsmith</ad-order-taker>
<CreateDate>07022019 13:50:31</CreateDate>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>jsmith</LastEditUser>
<order-number>00000994</order-number>
<price>10.00</price>
<company-id>1</company-id>
<company>Company1</company>
<CreationDate>070220191350</CreationDate>
<Campaign>
<CampaignId>205</CampaignId>
<CampaignNumber>00994-01</CampaignNumber>
<Name>DIGITAL TEST ACCOUNT01</Name>
<Type-id>1</Type-id>
<Type>Banner</Type>
<Category-id>1</Category-id>
<Category>Standard</Category>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Quantity>1000</Quantity>
<Price>10.00</Price>
<CampaignUnit>
<Id>7</Id>
<Name>300x250</Name>
<Width>300</Width>
<Height>250</Height>
</CampaignUnit>
<CampaignUnit>
<Id>6</Id>
<Name>728x90</Name>
<Width>728</Width>
<Height>90</Height>
</CampaignUnit>
<FlightGroup>
<Name>Group1</Name>
<FlightGroup-id>296</FlightGroup-id>
<CampaignUnit-id>7</CampaignUnit-id>
<CampaignUnit>300x250</CampaignUnit>
<Quantity>500</Quantity>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Flight>
<Flight-id>666</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>3</Page-id>
<Page>ATF</Page>
<SiteURL>www.anysite.com</SiteURL>
<InvoicedAlreadyFlag>0</InvoicedAlreadyFlag>
<PublishedFlag>true</PublishedFlag>
<Price>2.50</Price>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26901" PublishedFlag="true">07072019</date>
<date Insertion-id="26902" PublishedFlag="true">07082019</date>
<date Insertion-id="26903" PublishedFlag="true">07092019</date>
<date Insertion-id="26904" PublishedFlag="true">07102019</date>
<date Insertion-id="26905" PublishedFlag="true">07112019</date>
</dates>
</Flight>
<Flight>
<Flight-id>667</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>4</Page-id>
<Page>BTF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26926" PublishedFlag="true">07072019</date>
<date Insertion-id="26927" PublishedFlag="true">07082019</date>
<date Insertion-id="26928" PublishedFlag="true">07092019</date>
<date Insertion-id="26929" PublishedFlag="true">07102019</date>
<date Insertion-id="26930" PublishedFlag="true">07112019</date>
</dates>
</Flight>
</FlightGroup>
<FrequencyCap />
<AdServingId>3</AdServingId>
<AdServing>DFP</AdServing>
<CampaignViewTypeId>2</CampaignViewTypeId>
<CampaignViewType>Impressions</CampaignViewType>
<CreateDate>07022019 13:50:31</CreateDate>
<CreateUser>Rep1</CreateUser>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>Rep1</LastEditUser>
</Campaign>
<Company>
<ID>1</ID>
<COMPANYCODE>Company1</COMPANYCODE>
</Company>
</Info>
</Data>
文件#2-00994-01_297.xml
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Info>
<OrderCustomers>
<OrderCustomer>
<IsPrimaryOrderer>true</IsPrimaryOrderer>
<IsPrimaryPayor>true</IsPrimaryPayor>
<Customer>
<account-number>20007658</account-number>
<accountid>7659</accountid>
<Name1>DIGITAL TEST ACCOUNT</Name1>
<Phone>0000000000</Phone>
<Type-id>2</Type-id>
<Type>Commercial</Type>
<Company-id>1</Company-id>
<Company>Company1</Company>
<Address>
<Addr1>123 Main</Addr1>
<City>Anytown</City>
<Postal-Code>99999</Postal-Code>
<Country-id>1</Country-id>
<Country>USA</Country>
<State-id>113</State-id>
<State>TX</State>
</Address>
<PrimarySalesRep>Rep1</PrimarySalesRep>
<Category>Local</Category>
<PaymentMethod-id>4</PaymentMethod-id>
<PaymentMethod>Credit Card</PaymentMethod>
</Customer>
</OrderCustomer>
</OrderCustomers>
<ad-ordered-by>test</ad-ordered-by>
<publication-code>Y</publication-code>
<pagination-code>N</pagination-code>
<ProductionCode>N</ProductionCode>
<ad-sold-by-id>113</ad-sold-by-id>
<ad-sold-by>Rep1</ad-sold-by>
<ad-sold-by-name>National</ad-sold-by-name>
<ad-order-taker-id>15</ad-order-taker-id>
<ad-order-taker>jsmith</ad-order-taker>
<CreateDate>07022019 13:50:31</CreateDate>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>jsmith</LastEditUser>
<order-number>00000994</order-number>
<price>10.00</price>
<company-id>1</company-id>
<company>Company1</company>
<CreationDate>070220191350</CreationDate>
<Campaign>
<CampaignId>205</CampaignId>
<CampaignNumber>00994-01</CampaignNumber>
<Name>DIGITAL TEST ACCOUNT01</Name>
<Type-id>1</Type-id>
<Type>Banner</Type>
<Category-id>1</Category-id>
<Category>Standard</Category>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Quantity>1000</Quantity>
<Price>10.00</Price>
<CampaignUnit>
<Id>7</Id>
<Name>300x250</Name>
<Width>300</Width>
<Height>250</Height>
</CampaignUnit>
<CampaignUnit>
<Id>6</Id>
<Name>728x90</Name>
<Width>728</Width>
<Height>90</Height>
</CampaignUnit>
<FlightGroup>
<Name>Group2</Name>
<FlightGroup-id>297</FlightGroup-id>
<CampaignUnit-id>6</CampaignUnit-id>
<CampaignUnit>728x90</CampaignUnit>
<Quantity>500</Quantity>
<StartDate>07072019</StartDate>
<EndDate>07312019</EndDate>
<Flight>
<Flight-id>668</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>3</Page-id>
<Page>ATF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26951" PublishedFlag="true">07072019</date>
<date Insertion-id="26952" PublishedFlag="true">07082019</date>
<date Insertion-id="26953" PublishedFlag="true">07092019</date>
<date Insertion-id="26954" PublishedFlag="true">07102019</date>
<date Insertion-id="26955" PublishedFlag="true">07112019</date>
</dates>
</Flight>
<Flight>
<Flight-id>669</Flight-id>
<Site-id>2</Site-id>
<NetworkId>3</NetworkId>
<Network>Digital</Network>
<Site>anysite.com</Site>
<Section-id>20</Section-id>
<Section>Business</Section>
<Page-id>4</Page-id>
<Page>BTF</Page>
<SiteURL>www.anysite.com</SiteURL>
<Quantity>250</Quantity>
<dates>
<date Insertion-id="26976" PublishedFlag="true">07072019</date>
<date Insertion-id="26977" PublishedFlag="true">07082019</date>
<date Insertion-id="26978" PublishedFlag="true">07092019</date>
<date Insertion-id="26979" PublishedFlag="true">07102019</date>
<date Insertion-id="26980" PublishedFlag="true">07112019</date>
</dates>
</Flight>
</FlightGroup>
<FrequencyCap />
<AdServingId>3</AdServingId>
<AdServing>DFP</AdServing>
<CampaignViewTypeId>2</CampaignViewTypeId>
<CampaignViewType>Impressions</CampaignViewType>
<CreateDate>07022019 13:50:31</CreateDate>
<CreateUser>Rep1</CreateUser>
<LastEditDate>07022019 13:50:33</LastEditDate>
<LastEditUser>Rep1</LastEditUser>
</Campaign>
<Company>
<ID>1</ID>
<COMPANYCODE>Company1</COMPANYCODE>
</Company>
</Info>
</Data>
答案 0 :(得分:4)
“我需要能够为每个排班组生成一个文件,其余文件与原始文件重复。”:然后使用类似的方法
<xsl:template match="FlightGroup">
<xsl:result-document href="{/Info/Campaign/CampaignNumber}-{FlightGroup-id}.xml">
<xsl:apply-templates select="/" mode="split">
<xsl:with-param name="this-flight-group" select="." tunnel="yes"/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:template>
<xsl:template match="@* | node()" mode="split">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="FlightGroup" mode="split">
<xsl:param name="this-flight-group" tunnel="yes"/>
<xsl:if test=". is $this-flight-group">
<xsl:next-match/>
</xsl:if>
</xsl:template>
应该做。它以未命名的默认模式为FlightGroup
元素设置模板并创建结果文档,然后将整个文档通过名为split
的模式推送,将当前FlightGroup
元素存储在隧道参数。该模式已设置为使用身份转换作为基础处理,并且在匹配FlightGroup
元素时,具有一个模板,该模板根据具有{{1}的节点身份将隧道参数与当前处理的FlightGroup
进行比较}运算符,在使用身份证明的情况下,它仅将is
的处理委托给身份转换,否则,在该模式下将不对任何xsl:next-match
进行进一步的处理。
使用XSLT 3(由Saxon 9.8和更高版本(所有版本)以及Altova XML 2017 R3和更高版本支持)以及阴影属性和静态参数的新功能,甚至可以尝试编写一种通用解决方案,该解决方案采用“拆分”模式和“文件名”表达式作为静态参数,按照这种想法,上面的代码将实现为
FlightGroup
,任何想要使用特定文件名表达式(例如静态字符串<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:param name="split-pattern" as="xs:string" static="yes" select="'FlightGroup'"/>
<xsl:param name="file-name-expression" as="xs:string" static="yes" select="'{//Info/Campaign/CampaignNumber}-{FlightGroup-id}.xml'"/>
<xsl:template _match="{$split-pattern}">
<xsl:result-document _href="{$file-name-expression}">
<xsl:apply-templates select="/" mode="split">
<xsl:with-param name="this-split-element" select="." tunnel="yes"/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:template>
<xsl:mode name="split" on-no-match="shallow-copy"/>
<xsl:template _match="{$split-pattern}" mode="split">
<xsl:param name="this-split-element" tunnel="yes"/>
<xsl:if test=". is $this-split-element">
<xsl:next-match/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
加上子项选择foo
)拆分特定元素(例如split
)的人都可以简单地修改静态参数,例如在内联下面完成
id
但是,当然,XSLT 3处理器或IDE允许您设置静态参数,而无需触摸/更改XSLT代码本身。