需要一些帮助使用XSLT 1.0转换XML

时间:2013-03-21 13:55:43

标签: xslt xslt-1.0

需要一些关于平面文件架构的XSLT转换的帮助。是否可以将Record节点的直接子节点组合成一个包含Record节点的子节点?子512是必需的,最小和最大出现次数为1,并标记新Record节点的开头。

输入:

<ns0:Root xmlns="">
    <Header>
        <node01>AA</node01>
        <node02>123</node02>
    </Header>
    <Record>
        <512>
            <node01>BB</node01>
            <node02>123</node02>
        </512>
    </Record>
    <Record>
        <513>
            <node01>CC</node01>
            <node02>123</node02>
        </513>
    </Record>
    <Record>
        <512>
            <node01>DD</node01>
            <node02>123</node02>
        </512>
    </Record>
    <Record>
        <515>
            <node01>JJ</node01>
            <node02>123</node02>
        </515>
    </Record>
    <Record>
        <512>
            <node01>EE</node01>
            <node02>123</node02>
        </512>
    </Record>
    <Record>
        <513>
            <node01>FF</node01>
            <node02>123</node02>
        </513>
    </Record>
    <Record>
        <514>
            <node01>GG</node01>
            <node02>123</node02>
        </514>
        <514>
            <node01>HH</node01>
            <node02>123</node02>
        </514>
    </Record>
    <Footer>
        <node01>II</node01>
        <node02>123</node02>
    </Footer>
</ns0:Root>

期望输出:

<ns0:Root xmlns="">
    <Header>
        <item01>AA</item01>
        <item02>123</item02>
    </Header>
    <Record>
        <512>
            <item01>BB</item01>
            <item02>123</item02>
        </512>
        <513>
            <item01>CC</item01>
            <item02>123</item02>
        </513>
    </Record>
    <Record>
        <512>
            <item01>DD</item01>
            <item02>123</item02>
        </512>
        <515>
            <item01>JJ</item01>
            <item02>123</item02>
        </515>
    </Record>
    <Record>
        <512>
            <item01>EE</item01>
            <item02>123</item02>
        </512>
        <513>
            <item01>FF</item01>
            <item02>123</item02>
        </513>
        <514>
            <item01>GG</item01>
            <item02>123</item02>
        </514>
        <514>
            <item01>HH</item01>
            <item02>123</item02>
        </514>
    </Record>
    <Footer>
        <item01>II</item01>
        <item02>123</item02>
    </Footer>
</ns0:Root>

谢谢你,亲切的问候 菲利普

P.S。:XSLT 2.0不可用。

1 个答案:

答案 0 :(得分:2)

这不是合法的XML(元素名称不能以数字开头),但假设您将所有无效元素重命名为以“r”开头,则可以执行以下操作:

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

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

  <xsl:template match="Record[r512]">
    <xsl:copy>
      <xsl:apply-templates select="." mode="iterate" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Record" />

  <xsl:template match="Record" mode="iterate">
    <xsl:apply-templates />
    <xsl:apply-templates select="following-sibling::Record[1][not(r512)]"
                         mode="iterate"/>
  </xsl:template>
</xsl:stylesheet>

在此输入上运行时:

<ns0:Root xmlns="" xmlns:ns0="nsss">
  <Header>
    <node01>AA</node01>
    <node02>123</node02>
  </Header>
  <Record>
    <r512>
      <node01>BB</node01>
      <node02>123</node02>
    </r512>
  </Record>
  <Record>
    <r513>
      <node01>CC</node01>
      <node02>123</node02>
    </r513>
  </Record>
  <Record>
    <r512>
      <node01>DD</node01>
      <node02>123</node02>
    </r512>
  </Record>
  <Record>
    <r515>
      <node01>JJ</node01>
      <node02>123</node02>
    </r515>
  </Record>
  <Record>
    <r512>
      <node01>EE</node01>
      <node02>123</node02>
    </r512>
  </Record>
  <Record>
    <r513>
      <node01>FF</node01>
      <node02>123</node02>
    </r513>
  </Record>
  <Record>
    <r514>
      <node01>GG</node01>
      <node02>123</node02>
    </r514>
    <r514>
      <node01>HH</node01>
      <node02>123</node02>
    </r514>
  </Record>
  <Footer>
    <node01>II</node01>
    <node02>123</node02>
  </Footer>
</ns0:Root>

制作:

<ns0:Root xmlns:ns0="nsss">
  <Header>
    <node01>AA</node01>
    <node02>123</node02>
  </Header>
  <Record>
    <r512>
      <node01>BB</node01>
      <node02>123</node02>
    </r512>
    <r513>
      <node01>CC</node01>
      <node02>123</node02>
    </r513>
  </Record>
  <Record>
    <r512>
      <node01>DD</node01>
      <node02>123</node02>
    </r512>
    <r515>
      <node01>JJ</node01>
      <node02>123</node02>
    </r515>
  </Record>
  <Record>
    <r512>
      <node01>EE</node01>
      <node02>123</node02>
    </r512>
    <r513>
      <node01>FF</node01>
      <node02>123</node02>
    </r513>
    <r514>
      <node01>GG</node01>
      <node02>123</node02>
    </r514>
    <r514>
      <node01>HH</node01>
      <node02>123</node02>
    </r514>
  </Record>
  <Footer>
    <node01>II</node01>
    <node02>123</node02>
  </Footer>
</ns0:Root>