如何在父标记中包装子元素?

时间:2018-02-20 09:22:13

标签: xslt element

我想在面板中的标签和面板元素中包含标签元素

这是我的意见:

<test>
  <gui>
    <c name="NAME">dock1</c>
    <tab>
      <c name="NAME">TAB1</c>
      <panel>
        <c name="NAME">TAB1_1</c>
      </panel>
      <panel>
        <c name="NAME">TAB1_2</c>
      </panel>
    </tab>
  </gui>
  <gui>
    <c name="NAME">dock2</c>
    <tab>
      <c name="NAME">TAB2</c>
      <panel>
        <c name="NAME">TAB2_1</c>
      </panel>
    </tab>
    <tab>
      <c name="NAME">TAB2</c>
      <panel>
        <c name="NAME">TAB2_1</c>
      </panel>
    </tab>
    <tab>
      <c name="NAME">TAB3</c>
      <panel>
        <c name="NAME">TAB3_1</c>
        <c name="MODEL"/>
      </panel>
    </tab>
  </gui>
</test>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <gui>
    <c name="NAME">dock1</c>
    <tabs>
      <tab>
        <c name="NAME">TAB1</c>
        <panels>
          <c name="NAME">TAB1</c>
          <panel>
            <c name="NAME">TAB1_1</c>
          </panel>
          <panel>
            <c name="NAME">TAB1_2</c>
          </panel>
        </panels>
      </tab>
    </tabs>
  </gui>
  <gui>
    <c name="NAME">dock2</c>
    <tabs>
      <tab>
        <c name="NAME">TAB2</c>
        <panels>
          <c name="NAME">TAB2</c>
          <panel>
            <c name="NAME">TAB2_1</c>
          </panel>
        </panels>
      </tab>
      <tab>
        <c name="NAME">TAB2</c>
        <panels>
          <c name="NAME">TAB2</c>
          <panel>
            <c name="NAME">TAB2_1</c>
          </panel>
        </panels>
      </tab>
      <tab>
        <c name="NAME">TAB3</c>
        <panels>
          <c name="NAME">TAB3</c>
          <panel>
            <c name="NAME">TAB3_1</c>
            <c name="MODEL"></c>
          </panel>
        </panels>
      </tab>
    </tabs>
  </gui>
</test>

这是我的XSLT:

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

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

  <xsl:template match="/test/gui">
    <xsl:copy>
      <xsl:apply-templates select="c[@name='NAME']"/>
      <xsl:element name="tabs">
        <xsl:for-each select="tab">
          <xsl:copy>          
            <xsl:apply-templates select="c[@name='NAME']"/>
            <xsl:element name="panels">
              <xsl:apply-templates select="@*|node()"/>
            </xsl:element>
          </xsl:copy>
        </xsl:for-each>
      </xsl:element>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

这有点奏效,但间距/换行有问题

她是我的输出:

<?xml version="1.0" encoding="UTF-8"?><test>
  <gui><c name="NAME">dock1</c>
<tabs><tab><c name="NAME">TAB1</c>
<panels>
      <c name="NAME">TAB1</c>
      <panel>
        <c name="NAME">TAB1_1</c>
      </panel>
      <panel>
        <c name="NAME">TAB1_2</c>
      </panel>
    </panels>
</tab>
</tabs>
</gui>
  <gui><c name="NAME">dock2</c>
<tabs><tab><c name="NAME">TAB2</c>
<panels>
      <c name="NAME">TAB2</c>
      <panel>
        <c name="NAME">TAB2_1</c>
      </panel>
    </panels>
</tab>
<tab><c name="NAME">TAB2</c>
<panels>
      <c name="NAME">TAB2</c>
      <panel>
        <c name="NAME">TAB2_1</c>
      </panel>
    </panels>
</tab>
<tab><c name="NAME">TAB3</c>
<panels>
      <c name="NAME">TAB3</c>
      <panel>
        <c name="NAME">TAB3_1</c>
        <c name="MODEL"/>
      </panel>
    </panels>
</tab>
</tabs>
</gui>
</test>

为什么我的输出是这样的,我该如何解决?

1 个答案:

答案 0 :(得分:1)

添加<xsl:strip-space elements="*"/>,您应该获得缩进:http://xsltfiddle.liberty-development.net/eiQZDbn

如果你需要使用Xalan,那么它有一个自定义属性<xsl:output method="xml" version="1.0" indent="yes" xmlns:xalan="http://xml.apache.org/xslt" xalan:indent-amount="2"/>你可以申请获得缩进:http://xsltransform.hikmatu.com/3Nqn5Yb