Слияние <Rowset>по XSLT - PullRequest
       9

Слияние <Rowset>по XSLT

0 голосов
/ 17 апреля 2019

Мой XML выглядит следующим образом: (С двумя <Rowset>)

<?xml version="1.0" encoding="utf-8"?>
<Rowsets xmlns:xalan="http://xml.apache.org/xalan">
               <Rowset Name="TankList">
                              <Columns>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="PLANT" SQLDataType="1" SourceColumn="PLANT"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="LGORT" SQLDataType="1" SourceColumn="LGORT"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="TANK" SQLDataType="1" SourceColumn="TANK"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="TANKTYPE" SQLDataType="1" SourceColumn="TANKTYPE"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="MATNR" SQLDataType="1" SourceColumn="MATNR"/>
                              </Columns>
                              <Row>
                                             <PLANT>Y111</PLANT>
                                             <LGORT>T101</LGORT>
                                             <TANK>T101</TANK>
                                             <TANKTYPE>OIL</TANKTYPE>
                                             <MATNR>111111</MATNR>
                              </Row>


 <Row>
                                                 <PLANT>Y111</PLANT>
                                                 <LGORT>T101</LGORT>
                                                 <TANK>T101</TANK>
                                                 <TANKTYPE>OIL</TANKTYPE>
                                                 <MATNR>222222</MATNR>
                                  </Row>
               </Rowset>
               <Rowset Name="DCS">
                              <Columns>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventory" SQLDataType="1" SourceColumn="DCSInventory"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventoryUOM" SQLDataType="1" SourceColumn="DCSInventoryUOM"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSTank" SQLDataType="1" SourceColumn="DCSTank"/>
                              </Columns>
                              <Row>
                                             <DCSInventory>0193948</DCSInventory>
                                             <DCSInventoryUOM>GA</DCSInventoryUOM>
                                             <DCSTank>T101</DCSTank>
                              </Row>
               </Rowset>
</Rowsets>

Мое требование - объединить <Row> из <Rowset Name="DCS"> в другие <Rowset Name="TankList">

Мой результирующий XMLдолжен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Rowsets>
    <Rowset>
        <Columns xmlns:xalan="http://xml.apache.org/xalan">
            <Column Description="" MaxRange="1" MinRange="0" Name="PLANT" SQLDataType="1" SourceColumn="PLANT"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="LGORT" SQLDataType="1" SourceColumn="LGORT"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="TANK" SQLDataType="1" SourceColumn="TANK"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="TANKTYPE" SQLDataType="1" SourceColumn="TANKTYPE"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="MATNR" SQLDataType="1" SourceColumn="MATNR"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventory" SQLDataType="1" SourceColumn="DCSInventory"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventoryUOM" SQLDataType="1" SourceColumn="DCSInventoryUOM"/>
            <Column Description="" MaxRange="1" MinRange="0" Name="DCSTank" SQLDataType="1" SourceColumn="DCSTank"/>
        </Columns>
        <Row>
            <PLANT xmlns:xalan="http://xml.apache.org/xalan">Y111</PLANT>
            <LGORT xmlns:xalan="http://xml.apache.org/xalan">T101</LGORT>
            <TANK xmlns:xalan="http://xml.apache.org/xalan">T101</TANK>
            <TANKTYPE xmlns:xalan="http://xml.apache.org/xalan">OIL</TANKTYPE>
            <MATNR xmlns:xalan="http://xml.apache.org/xalan">111111</MATNR>
            <DCSInventory xmlns:xalan="http://xml.apache.org/xalan">0193948</DCSInventory>
            <DCSInventoryUOM xmlns:xalan="http://xml.apache.org/xalan">GA</DCSInventoryUOM>
            <DCSTank xmlns:xalan="http://xml.apache.org/xalan">T101</DCSTank>
        </Row>
    <Row>
            <PLANT xmlns:xalan="http://xml.apache.org/xalan">Y111</PLANT>
            <LGORT xmlns:xalan="http://xml.apache.org/xalan">T101</LGORT>
            <TANK xmlns:xalan="http://xml.apache.org/xalan">T101</TANK>
            <TANKTYPE xmlns:xalan="http://xml.apache.org/xalan">OIL</TANKTYPE>
            <MATNR xmlns:xalan="http://xml.apache.org/xalan">222222</MATNR>
            <DCSInventory xmlns:xalan="http://xml.apache.org/xalan">0193948</DCSInventory>
            <DCSInventoryUOM xmlns:xalan="http://xml.apache.org/xalan">GA</DCSInventoryUOM>
            <DCSTank xmlns:xalan="http://xml.apache.org/xalan">T101</DCSTank>
        </Row>
    </Rowset>
</Rowsets>

Я использовал XSLT, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
               <xsl:template match="/">
                              <Rowsets>
                                             <Rowset>
                                                            <xsl:for-each select="Rowsets/Rowset">
                                                                           <xsl:copy-of select="Columns"/>
                                                            </xsl:for-each>
                                                            <xsl:for-each select="Rowsets/Rowset/Row">
                                                                           <Row>
                                                                                          <xsl:for-each select="child::*">
                                                                                                         <xsl:copy-of select="."/>
                                                                                          </xsl:for-each>
                                                                           </Row>
                                                            </xsl:for-each>
                                             </Rowset>
                              </Rowsets>
               </xsl:template>
</xsl:stylesheet>

Но результирующий XML не объединяет <Row> и <Columns>, а копирует<Row> и <Columns> как дополнительный узел.

<?xml version="1.0" encoding="UTF-8"?><Rowsets>
    <Rowset>
        <Columns xmlns:xalan="http://xml.apache.org/xalan">
                                             <Column Description="" MaxRange="1" MinRange="0" Name="PLANT" SQLDataType="1" SourceColumn="PLANT"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="LGORT" SQLDataType="1" SourceColumn="LGORT"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="TANK" SQLDataType="1" SourceColumn="TANK"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="TANKTYPE" SQLDataType="1" SourceColumn="TANKTYPE"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="MATNR" SQLDataType="1" SourceColumn="MATNR"/>
                              </Columns>
        <Columns xmlns:xalan="http://xml.apache.org/xalan">
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventory" SQLDataType="1" SourceColumn="DCSInventory"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSInventoryUOM" SQLDataType="1" SourceColumn="DCSInventoryUOM"/>
                                             <Column Description="" MaxRange="1" MinRange="0" Name="DCSTank" SQLDataType="1" SourceColumn="DCSTank"/>
                              </Columns>
        <Row>
            <PLANT xmlns:xalan="http://xml.apache.org/xalan">Y111</PLANT>
            <LGORT xmlns:xalan="http://xml.apache.org/xalan">T101</LGORT>
            <TANK xmlns:xalan="http://xml.apache.org/xalan">T101</TANK>
            <TANKTYPE xmlns:xalan="http://xml.apache.org/xalan">OIL</TANKTYPE>
            <MATNR xmlns:xalan="http://xml.apache.org/xalan">111111</MATNR>
        </Row>
<Row>
                <PLANT xmlns:xalan="http://xml.apache.org/xalan">Y111</PLANT>
                <LGORT xmlns:xalan="http://xml.apache.org/xalan">T101</LGORT>
                <TANK xmlns:xalan="http://xml.apache.org/xalan">T101</TANK>
                <TANKTYPE xmlns:xalan="http://xml.apache.org/xalan">OIL</TANKTYPE>
                <MATNR xmlns:xalan="http://xml.apache.org/xalan">222222</MATNR>
            </Row>
        <Row>
            <DCSInventory xmlns:xalan="http://xml.apache.org/xalan">0193948</DCSInventory>
            <DCSInventoryUOM xmlns:xalan="http://xml.apache.org/xalan">GA</DCSInventoryUOM>
            <DCSTank xmlns:xalan="http://xml.apache.org/xalan">T101</DCSTank>
        </Row>
    </Rowset>
</Rowsets>

Что я делаю не так?Я просто не могу добраться до точки, где я могу удалить лишние <Columns> и <Row> за последние <Rowset>

Пожалуйста, помогите!

1 Ответ

1 голос
/ 18 апреля 2019

Вопрос несколько двусмысленный; Пример был бы гораздо полезнее, если бы строки не были идентичными. AFAICT, следующая таблица стилей вернет ожидаемый результат:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/Rowsets">
    <xsl:variable name="dcs" select="Rowset[@Name='DCS']"/>
    <xsl:copy>
        <xsl:for-each select="Rowset[@Name='TankList']">
            <Rowset>
                <Columns>
                    <xsl:copy-of select="Columns/Column"/>
                    <xsl:copy-of select="$dcs/Columns/Column"/>
                </Columns>
                <xsl:for-each select="Row">
                    <xsl:copy>
                        <xsl:copy-of select="*"/>
                        <xsl:copy-of select="$dcs/Row/*"/>
                    </xsl:copy>
                </xsl:for-each>
            </Rowset>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
...