【问题标题】:XSL Transformation - Turning a list into nested elements, How Can I do that?XSL 转换 - 将列表转换为嵌套元素,我该怎么做?
【发布时间】:2012-03-09 19:50:10
【问题描述】:

我有一堆旧模式版本的消息。我想消费消息 从旧模式,然后将它们转换为新模式形式。对此,我真的非常感激 如果有人可以帮助我。

我的新架构

<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 中实现这样的目标吗?非常感谢您的帮助。

【问题讨论】:

  • 需要排序吗?

标签: xml xslt xpath transformation


【解决方案1】:

用途:

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

如果你必须输出空的@9​​87654323@ 使用这个:

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

【讨论】:

  • 非常感谢,如果我的 auditList 中有更多元素,这个 xsl 是否有效?还是仅针对此消息修复?
  • @EmanuelSchuster,不客气。它适用于任意数量的Audit
  • 谢谢基里尔。我想知道,我是否需要将整个模板放在 xsl 的 标记中,还是应该放在 xsl 的顶部,然后通过 标记中的 apply-template 调用它?
  • 我有我的 xslt 文件,我应该将您粘贴的 xsl 代码放在它的正文中的哪个位置?
  • @EmanuelSchuster,这取决于你真正的 XML 和 XSLT。你应该试试这个解决方案。如果您有任何问题,请创建新问题并在那里发布您的 XML 以重现您的问题。
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2015-03-11
相关资源
最近更新 更多