0

我有以下 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>

如何使用转换/XSLT 实现这一点?

我尝试了各种 XSLT,但不知何故我无法实现它。

索汉姆

4

1 回答 1

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>节点。
于 2012-07-03T00:23:47.070 回答