-1

複数の行セットを含む XML をフォローしています。すべての Rowset を 1 つにマージしたい。XSLTまたは他の方法を使用してそれを行う方法を教えてください。

現在の 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>
    <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:

<?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>

どうすればこれを達成できますか?

ありがとう !

4

2 に答える 2

0

ティムの回答に基づいて、単純化された 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>

お役に立てば幸いです。

ソハム

于 2012-07-20T05:29:20.197 に答える
0

これは、標準の XSLT 恒等変換を利用することで実現できますが、すべてのノードを照合してコピーする代わりに、Row要素のみをコピーします。

<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>
于 2012-07-18T06:35:47.463 に答える