XSLT在子节点中拆分记录但仍保留父内容

时间:2015-08-18 04:19:20

标签: xml xslt

我有一个大型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>

1 个答案:

答案 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