【问题标题】:move xsl sibling node inside parent?在父节点内移动 xsl 兄弟节点?
【发布时间】:2010-03-08 15:50:56
【问题描述】:

我如何从中得到:

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Component Feature="toplevel">
        <File Id="fil8A88F8B155E29670FCA1B83F0E99E635" />
        <TypeLib Id="{DC88F377-25DD-49C8-99D9-1FD8AE484362}" >
            <Interface Id="{5D12ED70-0B5A-49C4-A8A3-FC4C209295BA}" />
            <Interface Id="{73E8EDB7-4293-496D-8ABD-F973F002A033}" />
        </TypeLib>
        <TypeLib Id="{F3C9A192-17C2-4E25-ADB9-89FFEEC0403E}">
            <Interface Id="{89FF44C6-979D-49B6-AF56-EC9509001DE4}" />
        </TypeLib>
    </Component>
</Include>

到这里:

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Component Feature="toplevel">
        <File Id="fil8A88F8B155E29670FCA1B83F0E99E635" >
            <TypeLib Id="{DC88F377-25DD-49C8-99D9-1FD8AE484362}" >
                <Interface Id="{5D12ED70-0B5A-49C4-A8A3-FC4C209295BA}" />
                <Interface Id="{73E8EDB7-4293-496D-8ABD-F973F002A033}" />
            </TypeLib>
            <TypeLib Id="{F3C9A192-17C2-4E25-ADB9-89FFEEC0403E}">
                <Interface Id="{89FF44C6-979D-49B6-AF56-EC9509001DE4}" />
            </TypeLib>
        </File>
    </Component>
</Include>

(将&lt;TypeLib&gt;s 移入&lt;File&gt;...)

谢谢,

【问题讨论】:

  • 仅供参考:当我在您的问题中格式化代码时,我注意到您在两个示例中的最后一个 &lt;Interface&gt; 标记的 Id 属性中缺少一个结束引号。我纠正了他们。希望这不是您遇到的问题的一部分。
  • 抱歉,不...这是由于我草率的复制/粘贴/格式化工作...

标签: xslt


【解决方案1】:
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:wi="http://schemas.microsoft.com/wix/2006/wi"
>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node()[not(self::wi:TypeLib)] | @*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="wi:File">
    <xsl:copy>
      <xsl:apply-templates select="node() | @* | following-sibling::wi:TypeLib" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

结果:

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Component Feature="toplevel">
    <File Id="fil8A88F8B155E29670FCA1B83F0E99E635">
      <TypeLib Id="{DC88F377-25DD-49C8-99D9-1FD8AE484362}">
        <Interface Id="{5D12ED70-0B5A-49C4-A8A3-FC4C209295BA}"></Interface>
        <Interface Id="{73E8EDB7-4293-496D-8ABD-F973F002A033}"></Interface>
      </TypeLib>
      <TypeLib Id="{F3C9A192-17C2-4E25-ADB9-89FFEEC0403E}">
        <Interface Id="{89FF44C6-979D-49B6-AF56-EC9509001DE4}"></Interface>
      </TypeLib>
    </File>
  </Component>
</Include>

这样工作:

  1. 身份模板(第一个)明确排除了&lt;TypeLib&gt;children
  2. 自定义模板处理&lt;File&gt; 节点,嵌套所有以下&lt;TypeLib&gt; 节点,即使它们成为&lt;File&gt; 的子节点
  3. 这会调用 &lt;TypeLib&gt; 节点的标识模板,现在可以完美复制它们

【讨论】:

  • 我已经对其进行了测试,它会产生我在答案中显示的输出。您是否使用我提供的样式表进行了测试,或者您是否与现有代码混合搭配?
  • 混搭...问题是,我已经定义了很多其他模板...如果我上传整个 .xsl 会有用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2014-02-05
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多