-1

我和我一起使用了 XML,其中包含多个 Rowset。我想将所有 Rowset 合并为一个。所以你能帮助我如何使用 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

我能够根据 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>

我希望它有所帮助。

索汉姆

于 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 回答