【问题标题】:Move certain child nodes down to a new grandchild level将某些子节点下移到新的孙级别
【发布时间】:2011-04-07 15:07:32
【问题描述】:

我发现了其他关于将节点向上移动到父节点的问题,但我错过了将它们向下移动到新创建的节点的技巧。

给定:

<Villain>
  <Name>Dr Evil</Name>
  <Age>49</Age>
  <Like>Money</Like>
  <Like>Sharks</Like>
  <Like>Lasers</Like>
</Villain>

我正在尝试使用 XSLT 将其转换为:

<Villain>
  <Name>Dr Evil</Name>
  <Age>49</Age>
  <Likes>
    <Like>Money</Like>
    <Like>Sharks</Like>
    <Like>Lasers</Like>
  </Likes>
</Villain>

也就是说,插入一个新的子节点,并将所有名为“Like”的子节点移到其下。

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案,以获得简短且严格遵循 XSLT 精神的解决方案。

标签: xml xslt


【解决方案1】:

这种转变

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

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

  <xsl:template match="Like[1]">
   <Likes>
    <xsl:apply-templates select="../Like" mode="copy"/>
   </Likes>
  </xsl:template>

   <xsl:template match="*" mode="copy">
    <xsl:call-template name="identity"/>
   </xsl:template>
   <xsl:template match="Like"/>
 </xsl:stylesheet>

应用于提供的 XML 文档时

<Villain>
  <Name>Dr Evil</Name>
  <Age>49</Age>
  <Like>Money</Like>
  <Like>Sharks</Like>
  <Like>Lasers</Like>
</Villain>

产生想要的正确结果

<Villain>
   <Name>Dr Evil</Name>
   <Age>49</Age>
   <Likes>
      <Like>Money</Like>
      <Like>Sharks</Like>
      <Like>Lasers</Like>
   </Likes>
</Villain>

请注意

  1. 身份规则的使用和覆盖

  2. 使用模式来指定稍微不同的处理。

【讨论】:

  • 工作得很好,谢谢!对于使用此功能的其他人,您需要在身份模板规则中包含 name="identity"(未显示)。
  • @DJC:抱歉,我遇到了代码格式问题。现已修复。
  • @Dimitre,我想说,我喜欢你将name="identity" 放在身份模板上的事实。它使代码更具可读性。我以前没见过。 ...但现在我看到@DJC 的评论暗示name="identity" 是必需的。嗯?我从来不知道它是必需的。
  • @LarsH:一般身份模板不需要name="identity。可能您只是不小心忘记了在 Dimitre 的代码中您按名称调用此模板,我相信这是@DJC 评论的唯一原因。不过,很好的问答+1
  • @jasso:谢谢,现在我看到 Dimitre 在 mode="copy" 模板中按名称调用它。 (在这里我以为他只是一个“有文化的程序员”。:-))我只考虑调用/应用身份模板的另一种方式,即来自默认模板,它不需要一个名字。
猜你喜欢
  • 1970-01-01
  • 2015-05-27
  • 2014-03-28
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多