2012-07-17 99 views
-1

我使用其中的多個行集跟蹤XML。我想將所有的Rowset合併成一個。所以你可以請幫助我如何使用XSLT或其他方法來做到這一點?在XML文檔中合併行集

當前XML:

<?xml version="1.0" encoding="utf-8"?> 
<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)"> 
    <Rowset> 
     <Row> 
      <Name>Philip</Name> 
      <City>London</City> 
      <Phone>123</Phone> 
     </Row> 
     <Row> 
      <Name>Derek</Name> 
      <City>Seattle</City> 
      <Phone>500</Phone> 
     </Row> 
     <Row> 
      <Name>Bruke</Name> 
      <City>LosAngeles</City> 
      <Phone>600</Phone> 
     </Row> 
     <Row> 
      <Name>Yang</Name> 
      <City>SFO</City> 
      <Phone>1233</Phone> 
     </Row> 
     <Row> 
      <Name>Cristina</Name> 
      <City>SanJose</City> 
      <Phone>890</Phone> 
     </Row> 
     <Row> 
      <Name>Meredith</Name> 
      <City>Sunnyvale</City> 
      <Phone>788</Phone> 
     </Row> 
     <Row> 
      <Name>Grey</Name> 
      <City>MountainView</City> 
      <Phone>456</Phone> 
     </Row> 
     <Row> 
      <Name>Torrence</Name> 
      <City>SAntaClara</City> 
      <Phone>432</Phone> 
     </Row> 
    </Rowset> 
</Rowsets> 

所以你們可以plz幫助我,我怎麼能做到這一點:

<?xml version="1.0" encoding="utf-8"?> 
<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)"> 
<Rowset> 
    <Columns> 
     <Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="12" SourceColumn="Name"/> 
     <Column Description="City" MaxRange="1" MinRange="0" Name="City" SQLDataType="4" SourceColumn="City"/> 
     <Column Description="Phone" MaxRange="1" MinRange="0" Name="Phone" SQLDataType="12" SourceColumn="Phone"/> 

    </Columns> 
    <Row> 
     <Name>Philip</Name> 
     <City>London</City> 
     <Phone>123</Phone> 

    </Row> 
    <Row> 
     <Name>Derek</Name> 
     <City>Seattle</City> 
     <Phone>500</Phone> 

    </Row> 
    <Row> 
     <Name>Bruke</Name> 
     <City>LosAngeles</City> 
     <Phone>600</Phone> 

    </Row> 

    <Rowset> 
     <Columns> 
      <Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="12" SourceColumn="Name"/> 
      <Column Description="City" MaxRange="1" MinRange="0" Name="City" SQLDataType="4" SourceColumn="City"/> 
      <Column Description="Phone" MaxRange="1" MinRange="0" Name="Phone" SQLDataType="12" SourceColumn="Phone"/> 

     </Columns> 
     <Row> 
     <Name>Yang</Name> 
     <City>SFO</City> 
     <Phone>1233</Phone> 

    </Row> 
    <Row> 
     <Name>Cristina</Name> 
     <City>SanJose</City> 
     <Phone>890</Phone> 

    </Row> 

    </Rowset> 
    <Rowset> 
     <Columns> 
      <Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="12" SourceColumn="Name"/> 
      <Column Description="City" MaxRange="1" MinRange="0" Name="City" SQLDataType="4" SourceColumn="City"/> 
      <Column Description="Phone" MaxRange="1" MinRange="0" Name="Phone" SQLDataType="12" SourceColumn="Phone"/> 

     </Columns> 
     <Row> 
     <Name>Meredith</Name> 
     <City>Sunnyvale</City> 
     <Phone>788</Phone> 

    </Row> 
    <Row> 
     <Name>Grey</Name> 
     <City>MountainView</City> 
     <Phone>456</Phone> 

    </Row> 
    <Row> 
     <Name>Torrence</Name> 
     <City>SAntaClara</City> 
     <Phone>432</Phone> 

    </Row> 

    </Rowset> 
</Rowset> 
</Rowsets> 

所需要輸出XML?

謝謝!

+0

你需要什麼語言/平臺來做到這一點? – 2012-07-17 19:24:23

回答

0

您可以通過使用標準的XSLT身份的變換實現這一目標,但不是匹配和複製的所有節點,你會只複製元素

<xsl:template match="@*|Row|Row/*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

對於其他的元素,你將匹配他們,但繼續處理他們的孩子,而不復制它們

<xsl:template match="*"> 
    <xsl:apply-templates select="node()"/> 
</xsl:template> 

您還需要一個模板來匹配根元素。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/Rowsets"> 
     <Rowsets> 
     <xsl:apply-templates select="@*"/> 
     <Rowset> 
      <xsl:apply-templates select="node()"/> 
     </Rowset> 
     </Rowsets> 
    </xsl:template> 

    <xsl:template match="@*|Row|Row/*"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:apply-templates select="node()"/> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的輸入樣本,下面是輸出

<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)"> 
    <Rowset> 
     <Row> 
     <Name>Philip</Name> 
     <City>London</City> 
     <Phone>123</Phone> 
     </Row> 
     <Row> 
     <Name>Derek</Name> 
     <City>Seattle</City> 
     <Phone>500</Phone> 
     </Row> 
     <Row> 
     <Name>Bruke</Name> 
     <City>LosAngeles</City> 
     <Phone>600</Phone> 
     </Row> 
     <Row> 
     <Name>Yang</Name> 
     <City>SFO</City> 
     <Phone>1233</Phone> 
     </Row> 
     <Row> 
     <Name>Cristina</Name> 
     <City>SanJose</City> 
     <Phone>890</Phone> 
     </Row> 
     <Row> 
     <Name>Meredith</Name> 
     <City>Sunnyvale</City> 
     <Phone>788</Phone> 
     </Row> 
     <Row> 
     <Name>Grey</Name> 
     <City>MountainView</City> 
     <Phone>456</Phone> 
     </Row> 
     <Row> 
     <Name>Torrence</Name> 
     <City>SAntaClara</City> 
     <Phone>432</Phone> 
     </Row> 
    </Rowset> 
</Rowsets> 
+0

感謝您的回答。它確實幫助我寫了一個簡單的XSLT,這足以滿足我的要求! – 2012-07-20 05:27:36

0

我能夠基於Tim的答案寫簡單的XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <Rowsets DateCreated="{Rowsets/@DateCreated}" Version="{Rowsets/@Version}" StartDate="{Rowsets/@StartDate}" EndDate="{Rowsets/@EndDate}"> 
     <Rowset> 
      <xsl:for-each select="Rowsets/Rowset"> 
       <xsl:variable name="RowsetNo"> 
           <xsl:value-of select="position()"/> 
       </xsl:variable> 
       <xsl:if test="$RowsetNo = 1"> 
        <xsl:copy-of select="Columns"/> 
       </xsl:if> 
       <xsl:copy-of select="Row"/> 
      </xsl:for-each> 
     </Rowset> 
    </Rowsets> 
</xsl:template> 

我希望它有幫助。

Soham