代码之家  ›  专栏  ›  技术社区  ›  user836968

使用XSLT1.0转换XML需要一些帮助

  •  1
  • user836968  · 技术社区  · 13 年前

    需要一些关于平面文件模式的XSLT转换的帮助。是否可以将 Record 节点为一个包含 记录 节点?小孩 512 是必需的,最小和最大出现次数为1,并标记新的开始 记录 节点。

    输入:

    <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>
    

    谢谢你并致以良好的问候 菲利普

    附言:XSLT 2.0不可用。

    1 回复  |  直到 12 年前
        1
  •  1
  •   JLRishe    13 年前

    这不是合法的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>