XSL转换 - 将列表转换为嵌套元素,我该怎么做?

时间:2012-03-09 19:50:11

标签: xml xslt xpath transformation

我有一堆旧架构版本的消息。我想要消息 从较旧的模式,然后将它们转换为新的模式表单。对此,我真的非常感激 如果有人能帮我这个。

我的新架构

<Audit>
       <time>12:35</time>
       <number>13354</number>
       <previousAudit>
               <time>2:54</time>
               <number>12667</number>
               <previousAudit>
                      <time>7:05</time>
                      <number>10659</number>       
                      <previousAudit/>
               </previousAudit>
       </previousAudit>
</Audit>       


My Old Schema
-------------

<MyAuditList>
<Audit>
       <time>12:35</time>
       <number>13354</number>      
</Audit>       
<Audit>
       <time>1:27</time>
       <number>13650</number>      
</Audit>       
<Audit>
       <time>7:05</time>
       <number>10659</number>      
</Audit>       
</MyAuditList>

所以我想以递归方式读取我的旧架构(消息的审核列表并将其嵌入上一个审核表单中),如何 我能在xsl中找到这样的东西吗?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用:

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

  <xsl:template match="MyAuditList">
    <Audit>
      <xsl:copy-of select="Audit[1]/*"/>
      <xsl:apply-templates select="Audit[2]"/>
    </Audit>
  </xsl:template>

  <xsl:template match="Audit">
    <previousAudit>
      <xsl:copy-of select="*"/>
      <xsl:apply-templates select="following-sibling::Audit"/>
    </previousAudit>
  </xsl:template>

</xsl:stylesheet>

输出:

<Audit>
  <time>12:35</time>
  <number>13354</number>
  <previousAudit>
    <time>1:27</time>
    <number>13650</number>
    <previousAudit>
      <time>7:05</time>
      <number>10659</number>
    </previousAudit>
  </previousAudit>
</Audit>

如果您必须输出空previousAudit,请使用以下内容:

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

  <xsl:template match="MyAuditList">
    <Audit>
      <xsl:copy-of select="Audit[1]/*"/>
      <previousAudit>
        <xsl:apply-templates select="Audit[2]"/>
      </previousAudit>
    </Audit>
  </xsl:template>

  <xsl:template match="Audit">
    <xsl:copy-of select="*"/>
    <previousAudit>
      <xsl:apply-templates select="following-sibling::Audit"/>
    </previousAudit>
  </xsl:template>

</xsl:stylesheet>

输出:

<Audit>
  <time>12:35</time>
  <number>13354</number>
  <previousAudit>
    <time>1:27</time>
    <number>13650</number>
    <previousAudit>
      <time>7:05</time>
      <number>10659</number>
      <previousAudit />
    </previousAudit>
  </previousAudit>
</Audit>