2012-07-03 46 views
0

我有以下XML字段:XSLT的幫助,包括在一個XML

<?xml version="1.0" encoding="utf-8"?> 
<Rowsets> 
    <Rowset> 
     <Columns> 
      <Column Description="DrilldownDepth" MaxRange="1" MinRange="0" Name="DrilldownDepth" SQLDataType="4" SourceColumn="DrilldownDepth"/> 
      <Column Description="ABC" MaxRange="1" MinRange="0" Name="ABC" SQLDataType="4" SourceColumn="ABC"/> 
      <Column Description="DEF" MaxRange="1" MinRange="0" Name="DEF" SQLDataType="-1" SourceColumn="DEF"/> 
      <Column Description="PQR" MaxRange="1" MinRange="0" Name="PQR" SQLDataType="-1" SourceColumn="PQR"/> 
     </Columns> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>25</ABC> 
      <DEF>DDD</DEF> 
      <PQR>PPP</PQR> 
     </Row> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>16</ABC> 
      <DEF>AAA</DEF> 
      <PQR>BBB</PQR> 
     </Row> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>19</ABC> 
      <DEF>SEE</DEF> 
      <PQR>HELP</PQR> 
     </Row> 
    </Rowset> 
</Rowsets> 

現在我需要在每一行添加。因此我的XML將如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<Rowsets> 
    <Rowset> 
     <Columns> 
      <Column Description="DrilldownDepth" MaxRange="1" MinRange="0" Name="DrilldownDepth" SQLDataType="4" SourceColumn="DrilldownDepth"/> 
      <Column Description="ABC" MaxRange="1" MinRange="0" Name="ABC" SQLDataType="4" SourceColumn="ABC"/> 
      <Column Description="DEF" MaxRange="1" MinRange="0" Name="DEF" SQLDataType="-1" SourceColumn="DEF"/> 
      <Column Description="PQR" MaxRange="1" MinRange="0" Name="PQR" SQLDataType="-1" SourceColumn="PQR"/> 
     </Columns> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>25</ABC> 
      <DEF>DDD</DEF> 
      <PQR>PPP</PQR> 
      <XYZ></XYZ> 
     </Row> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>16</ABC> 
      <DEF>AAA</DEF> 
      <PQR>BBB</PQR> 
      <XYZ></XYZ> 
     </Row> 
     <Row> 
      <DrilldownDepth>1</DrilldownDepth> 
      <ABC>19</ABC> 
      <DEF>SEE</DEF> 
      <PQR>HELP</PQR> 
      <XYZ></XYZ> 
     </Row> 
    </Rowset> 
</Rowsets> 

如何使用transform/XSLT實現此目標?

我試過各種XSLT,但不知何故我無法實現它。

Soham

回答

1

這個簡單的XSLT:

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

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

    <!-- Template #2 --> 
    <xsl:template match="Row"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
     <XYZ></XYZ> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

...當應用於原始XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Rowsets> 
    <Rowset> 
    <Columns> 
     <Column Description="DrilldownDepth" MaxRange="1" MinRange="0" Name="DrilldownDepth" SQLDataType="4" SourceColumn="DrilldownDepth"/> 
     <Column Description="ABC" MaxRange="1" MinRange="0" Name="ABC" SQLDataType="4" SourceColumn="ABC"/> 
     <Column Description="DEF" MaxRange="1" MinRange="0" Name="DEF" SQLDataType="-1" SourceColumn="DEF"/> 
     <Column Description="PQR" MaxRange="1" MinRange="0" Name="PQR" SQLDataType="-1" SourceColumn="PQR"/> 
    </Columns> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>25</ABC> 
     <DEF>DDD</DEF> 
     <PQR>PPP</PQR> 
    </Row> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>16</ABC> 
     <DEF>AAA</DEF> 
     <PQR>BBB</PQR> 
    </Row> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>19</ABC> 
     <DEF>SEE</DEF> 
     <PQR>HELP</PQR> 
    </Row> 
    </Rowset> 
</Rowsets> 

...產生所期望的結果:

<?xml version="1.0" encoding="UTF-8"?><Rowsets> 
    <Rowset> 
    <Columns> 
     <Column Description="DrilldownDepth" MaxRange="1" MinRange="0" Name="DrilldownDepth" SQLDataType="4" SourceColumn="DrilldownDepth"/> 
     <Column Description="ABC" MaxRange="1" MinRange="0" Name="ABC" SQLDataType="4" SourceColumn="ABC"/> 
     <Column Description="DEF" MaxRange="1" MinRange="0" Name="DEF" SQLDataType="-1" SourceColumn="DEF"/> 
     <Column Description="PQR" MaxRange="1" MinRange="0" Name="PQR" SQLDataType="-1" SourceColumn="PQR"/> 
    </Columns> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>25</ABC> 
     <DEF>DDD</DEF> 
     <PQR>PPP</PQR> 
     <XYZ/> 
    </Row> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>16</ABC> 
     <DEF>AAA</DEF> 
     <PQR>BBB</PQR> 
     <XYZ/> 
    </Row> 
    <Row> 
     <DrilldownDepth>1</DrilldownDepth> 
     <ABC>19</ABC> 
     <DEF>SEE</DEF> 
     <PQR>HELP</PQR> 
     <XYZ/> 
    </Row> 
    </Rowset> 
</Rowsets> 

說明:

  • 模板#1是身份模板;它按原樣複製所有節點/屬性(除非被後續模板覆蓋)。
  • 模板#2每複製<row>元素,處理子元素(通過標識模板),並添加所需的<XYZ>節點。
+0

WOW,那很快! ..它確實滿足我的要求:) ..感謝一噸的幫助.. –

+0

我的榮幸,@索姆!請記住,您可以通過在向上/向下投票計數附近切換問號符號來標記答案。 :) – ABach