我有一个大型XML文件,它在XML文件中有多个子记录。 我想为每个子记录拆分XML文件,但希望保留父内容而不接触它。
以下是我的XML文件示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DATA>
<Account Number='1536764-9'>
<T1>testing1</T1>
<T2>testing2</T2>
<T3>testing3</T3>
<T4>testing4</T4>
<Mobile Number='12345'>
<InvoiceNo>40800844</InvoiceNo>
<SO_RC>
<Code>7679</Code>
<Description>GPS - Fleet Management Service</Description>
<Amt>268.00</Amt>
<PeriodFromDate>01/08/2015</PeriodFromDate>
<PeriodToDate>31/08/2015</PeriodToDate>
</SO_RC>
<TotalSubscriber>268.00</TotalSubscriber>
</Mobile>
<Mobile Number='22345'>
<InvoiceNo>40800844</InvoiceNo>
<SO_RC>
<Code>7679</Code>
<Description>GPS - Fleet Management Service</Description>
<Amt>268.00</Amt>
<PeriodFromDate>01/08/2015</PeriodFromDate>
<PeriodToDate>31/08/2015</PeriodToDate>
</SO_RC>
<TotalSubscriber>268.00</TotalSubscriber>
</Mobile>
<Mobile Number='32345'>
<InvoiceNo>40800844</InvoiceNo>
<SO_RC>
<Code>7679</Code>
<Description>GPS - Fleet Management Service</Description>
<Amt>268.00</Amt>
<PeriodFromDate>01/08/2015</PeriodFromDate>
<PeriodToDate>31/08/2015</PeriodToDate>
</SO_RC>
<TotalSubscriber>268.00</TotalSubscriber>
</Mobile>
</Account>
<Total_Records>212</Total_Records>
<Total_Outstanding_Balance>0.00</Total_Outstanding_Balance>
<Total_Current_Bill_Amt>0.00</Total_Current_Bill_Amt>
</DATA>
我有一些类似下面的脚本,能够拆分孩子但不复制下面的父内容
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="DATA/Account/Mobile">
<xsl:result-document href="file:///{encode-for-uri('{WATCHTEMPFOLDER}')}{format-number(position(),'000000000')}.xml">
<DATA>
<Account>
<xsl:apply-templates select="."/>
</Account>
</DATA>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
此代码能够通过复制所有Mobile标记信息来拆分我的Child内容。但我没有在新XML中获得任何父内容。我的代码结果显示如下:
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<Account>
<Mobile Number="62087704">
<InvoiceNo>40800844</InvoiceNo>
<SO_RC>
<Code>7679</Code>
<Description>GPS - Fleet Management Service</Description>
<Amt>268.00</Amt>
<PeriodFromDate>01/08/2015</PeriodFromDate>
<PeriodToDate>31/08/2015</PeriodToDate>
</SO_RC>
<TotalSubscriber>268.00</TotalSubscriber>
</Mobile>
</Account>
</DATA>
我在XSLT中不是那么好,但希望得到一些建议或评论我如何才能实现所需的XML文件(如下所示)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DATA>
<Account Number='1536764-9'>
<T1>testing1</T1>
<T2>testing2</T2>
<T3>testing3</T3>
<T4>testing4</T4>
<Mobile Number='32345'>
<InvoiceNo>40800844</InvoiceNo>
<SO_RC>
<Code>7679</Code>
<Description>GPS - Fleet Management Service</Description>
<Amt>268.00</Amt>
<PeriodFromDate>01/08/2015</PeriodFromDate>
<PeriodToDate>31/08/2015</PeriodToDate>
</SO_RC>
<TotalSubscriber>268.00</TotalSubscriber>
</Mobile>
</Account>
<Total_Records>212</Total_Records>
<Total_Outstanding_Balance>0.00</Total_Outstanding_Balance>
<Total_Current_Bill_Amt>0.00</Total_Current_Bill_Amt>
</DATA>
答案 0 :(得分:1)
怎么样......
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0"
exclude-result-prefixes="xs xsi">
<xsl:output indent="yes" encoding="utf-8" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:param name="base-dir" select="'C:\What-ever-directory\'" />
<xsl:template match="/">
<xsl:apply-templates select="DATA/Account/Mobile" />
<empty xsi:nil="true" />
</xsl:template>
<xsl:template match="Mobile">
<xsl:variable name="doc-no" as="xs:string">
<xsl:number format="000000001" level="any" />
</xsl:variable>
<xsl:variable name="href" select="concat('file:///', encode-for-uri( concat( $base-dir, $doc-no)),'.xml')" />
<xsl:result-document href="{$href}" indent="yes" encoding="utf-8" omit-xml-declaration="yes">
<xsl:apply-templates select="/*" mode="mini-doc">
<xsl:with-param name="Mobile" tunnel="yes" select="." />
</xsl:apply-templates>
</xsl:result-document>
</xsl:template>
<xsl:template match="@*|node()" mode="mini-doc">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="mini-doc"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Mobile" mode="mini-doc">
<xsl:param name="Mobile" tunnel="yes" />
<xsl:if test=". is $Mobile">
<xsl:next-match />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
主输出文档是nil,但如果这不是你想要的,那么只需用xsl:copy-of
替换nil的序列构造函数。将基目录作为参数传递给此样式表,参数名称为base-dir
。