XSLT有助于在XML中包含字段

时间:2012-07-03 00:19:49

标签: 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 个答案:

答案 0 :(得分: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>节点。